Удалите все знаки препинания из строки php для удобного URL-адреса seo
Итак, я видел массу решений на этом сайте, но ни одно из них, похоже, не работает для меня полностью. Я хотел бы удалить все знаки препинания из названия сообщения, чтобы система могла динамически создавать URL-адреса для каждого сообщения. Я нашел статью Дэвида Уолша, в которой дано пошаговое руководство о том, как этого можно достичь. Однако не все обнажается. Вот ссылка на статью (на всякий случай): http://davidwalsh.name/php-seo . Вот код, который я изменил, чтобы удалить все знаки препинания:
$return = trim(preg_replace('/[^a-z0-9]+/i'," ", strtolower($post_name)));
Вот пример названия сообщения: Тестирование, это и многое другое! Результаты, когда я повторяю URL-адрес: testing-039-s-this-amp-more.php Я не уверен, почему он сохраняет HTML-код для амперсанда и одинарной кавычки. Любые идеи.
Ага, похоже, сущности переводятся. Но почему именно 039? Попробуйте выполнить отладочную печать для $ post_name, прежде чем делать это заранее. — person   schedule 25.03.2014
Ответы (2)
Похоже, данные проходят где-то htmlspecialchars() или htmlentities() . Отмените это сначала с помощью htmlspecialchars_decode() или html_entity_decode() :
$return = trim(preg_replace('/[^a-z0-9]+/i'," ", strtolower(htmlspecialchars_decode($post_name))));
Так близко. URL-адрес при отображении теперь выглядит следующим образом: testing-039-s-this-more.php. Похоже, что он удалил только усилитель для URL-адреса. 🙁 — person Majormountain; 25.03.2014
Итак, я просматриваю свой код и обнаружил, что название сообщения окружено htmlentities (): $post_name = htmlentities(($_POST[‘post_name’]), ENT_QUOTES, ‘utf-8’); — person Majormountain; 25.03.2014
Вот и все! Еще один вопрос . Почему-то добавляется пробел между буквами g и s. Есть ли способ это исправить? Похоже, что этого больше нигде в URL-адресе не происходит. Вот обновленный URL после исправления кода: testing-s-this-more.php — person Majormountain; 25.03.2014
Не бери в голову! Я вставил код, использованный в статье: $return = trim(ereg_replace(‘ +’, ‘ ‘, preg_replace(‘/[^a-zA-Z0-9\s]/’, », strtolower($post_name)))); , и теперь он отлично работает! Спасибо за вашу помощь: D — person Majormountain; 25.03.2014
/** * prepares a string optimized for SEO * @see https://blog.ueffing.net/post/2016/03/14/string-seo-optimieren-creating-seo-friendly-url/ * @param String $string * @return String $string SEO optimized String */ function seofy ($sString = '') < $sString = preg_replace('/[^\\pL\d_]+/u', '-', $sString); $sString = trim($sString, "-"); $sString = iconv('utf-8', "us-ascii//TRANSLIT", $sString); $sString = strtolower($sString); $sString = preg_replace('/[^-a-z0-9_]+/', '', $sString); return $sString; >// Example seofy("Testing's, this & more!"); // => testing-s-this-more
how to strip punctuation in php
It would probably be easier to just keep the characters you want. Do you just want to retain a-z (upper and lower) 0-9 and the characters you’ve listed? Also, what’s «phpr»?
6 Answers 6
Here’s a neat way to do it:
preg_replace("#[[:punct:]]#", "", $target);
This cannot be the correct answer as it strips all punctuation but the original question specifies exceptions.
Since you need to match some Unicode characters ( € ) it would be sensible to use a regular expression. The pattern \p matches any known punctuation, and the assertion excludes your desired special characters from vanishing:
$text = preg_replace("/(?![.=$'€%-])\p/u", "", $text);
Can you please explain this pattern, I am a newbie in PCRE, and it’s the first time I see a (?!) which is not a lookahead, or something I just don’t understand. Also, I don’t understand \p
@AlexanderMP: The negative lookahead (. ) assertion is best explained here: regular-expressions.info/lookaround.html — And the \p is somewhat cryptic, but there is also a nice overview there: regular-expressions.info/unicode.html
$test = str_replace(array("?","!",",",";"), "", $test);
although it would be more correct and easy to specify the characters you want to strip, instead of characters (from an unknown set) you don’t want to strip.
You don’t have to escape $ inside of a character class — but AFAIK — should be the first or last item.
Could be. I just feel more comfortable when escaping all special chars which are used in PCRE. But thanks for the hint.
preg_replace("/[^\w-\p\p\p\$\.€%']/", "", 'YOUR DATA');
You didn’t mentioned if you wanted spaces or not, so that will strip that too.
Need to save string as alphaNum with specific punctuation and don’t want to completely discard characters with special punctuation.
class ClassName < protected static $cleanChars = array( '<' =>'', '>' => '', ''' => '', '&' => '', '"' => '', 'À' => 'A', 'Á' => 'A', 'Â' => 'A', 'Ã' => 'A', 'Ä' => 'Ae', 'Ä' => 'A', 'Å' => 'A', 'Ā' => 'A', 'Ą' => 'A', 'Ă' => 'A', 'Æ' => 'Ae', 'Ç' => 'C', 'Ć' => 'C', 'Č' => 'C', 'Ĉ' => 'C', 'Ċ' => 'C', 'Ď' => 'D', 'Đ' => 'D', 'Ð' => 'D', 'È' => 'E', 'É' => 'E', 'Ê' => 'E', 'Ë' => 'E', 'Ē' => 'E', 'Ę' => 'E', 'Ě' => 'E', 'Ĕ' => 'E', 'Ė' => 'E', 'Ĝ' => 'G', 'Ğ' => 'G', 'Ġ' => 'G', 'Ģ' => 'G', 'Ĥ' => 'H', 'Ħ' => 'H', 'Ì' => 'I', 'Í' => 'I', 'Î' => 'I', 'Ï' => 'I', 'Ī' => 'I', 'Ĩ' => 'I', 'Ĭ' => 'I', 'Į' => 'I', 'İ' => 'I', 'IJ' => 'IJ', 'Ĵ' => 'J', 'Ķ' => 'K','Ł' => 'K', 'Ľ' => 'K', 'Ĺ' => 'K', 'Ļ' => 'K', 'Ŀ' => 'K', 'Ñ' => 'N', 'Ń' => 'N', 'Ň' => 'N', 'Ņ' => 'N', 'Ŋ' => 'N', 'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O', 'Õ' => 'O', 'Ö' => 'Oe', 'Ö' => 'Oe', 'Ø' => 'O', 'Ō' => 'O', 'Ő' => 'O', 'Ŏ' => 'O', 'Œ' => 'OE', 'Ŕ' => 'R', 'Ř' => 'R', 'Ŗ' => 'R', 'Ś' => 'S', 'Š' => 'S', 'Ş' => 'S', 'Ŝ' => 'S', 'Ș' => 'S', 'Ť' => 'T', 'Ţ' => 'T', 'Ŧ' => 'T', 'Ț' => 'T', 'Ù' => 'U', 'Ú' => 'U', 'Û' => 'U', 'Ü' => 'Ue', 'Ū' => 'U', 'Ü' => 'Ue', 'Ů' => 'U', 'Ű' => 'U', 'Ŭ' => 'U', 'Ũ' => 'U', 'Ų' => 'U', 'Ŵ' => 'W', 'Ý' => 'Y', 'Ŷ' => 'Y', 'Ÿ' => 'Y', 'Ź' => 'Z', 'Ž' => 'Z', 'Ż' => 'Z', 'Þ' => 'T', 'à' => 'a', 'á' => 'a', 'â' => 'a', 'ã' => 'a', 'ä' => 'ae', 'ä' => 'ae', 'å' => 'a', 'ā' => 'a', 'ą' => 'a', 'ă' => 'a', 'æ' => 'ae', 'ç' => 'c', 'ć' => 'c', 'č' => 'c', 'ĉ' => 'c', 'ċ' => 'c', 'ď' => 'd', 'đ' => 'd', 'ð' => 'd', 'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e', 'ē' => 'e', 'ę' => 'e', 'ě' => 'e', 'ĕ' => 'e', 'ė' => 'e', 'ƒ' => 'f', 'ĝ' => 'g', 'ğ' => 'g', 'ġ' => 'g', 'ģ' => 'g', 'ĥ' => 'h', 'ħ' => 'h', 'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i', 'ī' => 'i', 'ĩ' => 'i', 'ĭ' => 'i', 'į' => 'i', 'ı' => 'i', 'ij' => 'ij', 'ĵ' => 'j', 'ķ' => 'k', 'ĸ' => 'k', 'ł' => 'l', 'ľ' => 'l', 'ĺ' => 'l', 'ļ' => 'l', 'ŀ' => 'l', 'ñ' => 'n', 'ń' => 'n', 'ň' => 'n', 'ņ' => 'n', 'ʼn' => 'n', 'ŋ' => 'n', 'ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'õ' => 'o', 'ö' => 'oe', 'ö' => 'oe', 'ø' => 'o', 'ō' => 'o', 'ő' => 'o', 'ŏ' => 'o', 'œ' => 'oe', 'ŕ' => 'r', 'ř' => 'r', 'ŗ' => 'r', 'š' => 's', 'ù' => 'u', 'ú' => 'u', 'û' => 'u', 'ü' => 'ue', 'ū' => 'u', 'ü' => 'ue', 'ů' => 'u', 'ű' => 'u', 'ŭ' => 'u', 'ũ' => 'u', 'ų' => 'u', 'ŵ' => 'w', 'ý' => 'y', 'ÿ' => 'y', 'ŷ' => 'y', 'ž' => 'z', 'ż' => 'z', 'ź' => 'z', 'þ' => 't', 'ß' => 'ss', 'ſ' => 'ss', 'ый' => 'iy', 'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G', 'Д' => 'D', 'Е' => 'E', 'Ё' => 'YO', 'Ж' => 'ZH', 'З' => 'Z', 'И' => 'I', 'Й' => 'Y', 'К' => 'K', 'Л' => 'L', 'М' => 'M', 'Н' => 'N', 'О' => 'O', 'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T', 'У' => 'U', 'Ф' => 'F', 'Х' => 'H', 'Ц' => 'C', 'Ч' => 'CH', 'Ш' => 'SH', 'Щ' => 'SCH', 'Ъ' => '', 'Ы' => 'Y', 'Ь' => '', 'Э' => 'E', 'Ю' => 'YU', 'Я' => 'YA', 'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'ё' => 'yo', 'ж' => 'zh', 'з' => 'z', 'и' => 'i', 'й' => 'y', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sch', 'ъ' => '', 'ы' => 'y', 'ь' => '', 'э' => 'e', 'ю' => 'yu', 'я' => 'ya' ); public static function clean($string, $allowed=array(), $base="a-zA-Z0-9 ") < if(empty($allowed) && !$base)< return false; >$ignore = ""; if(is_array($allowed)) < foreach($allowed as $a)< $ignore .= preg_quote($a); >> return preg_replace( "/[^\s]/", "", $string ); > public static function alphaNum($string, $allowed=array(), $convert=false) < if($convert)< $string = strtr($string, self::$cleanChars); >return self::clean($string, $allowed, 'a-zA-Z0-9 '); > >
Strip all punctuation but convert special chars:
ClassName::alphaNum($string, null, true);
Alpha Num + additional punctuation:
Alpha Num + additional punctuation and convert:
ClassName::alphaNum($string, array(‘_’, ‘-‘, ‘,’, ‘.’), true);
Conclusion: If you are expecting special chars and don’t completely want to discard them you can convert them before checking alphaNum. (eg. on sanitizing file names etc.)
If discarding the special chars does not have any real impact and is not really expected on the system you can call it without conversion of punctuation to save processing power. (eg. on setting keys for large arrays from strings)
PHP УДАЛИТЬ ЗНАКИ ПРЕПИНАНИЯ ИЗ СТРОКИ
PHP предоставляет различные встроенные функции для обработки строк. Одной из таких функций является функция preg_replace(), которая позволяет производить поиск и замену с использованием регулярных выражений. Чтобы удалить знаки препинания из строки, можно использовать такой код:
$str = «Привет, мир!»;
$str = preg_replace(«/[[:punct:]]+/u», «», $str);
echo $str;
В этом коде мы создаем переменную $str со строкой «Привет, мир!» и затем используем функцию preg_replace() для поиска всех знаков препинания в строке с помощью регулярного выражения. Флаг u означает использование Юникода для работы с юникодовскими символами. Затем мы заменяем все найденные знаки пустой строкой. Функция возвращает измененную строку, которую мы выводим с помощью функции echo.
Если вам нужно удалить только определенные знаки препинания, вы можете изменить регулярное выражение. Например, чтобы удалить только запятые и точки, вы можете использовать такой код:
$str = «Привет, мир!»;
$str = preg_replace(«/[\.,]+/u», «», $str);
echo $str;
В этом коде мы используем регулярное выражение [\.,]+ для поиска всех запятых и точек в строке. Затем мы заменяем их пустыми строками и выводим измененную строку.
Изучение PHP для начинающих — Урок #22 — Строковые функции
#24 Уроки PHP — Учим язык PHP, Чтение из файла и запись в файл на PHP
#47 Уроки PHP — Учим язык PHP, Передача параметров методом GET на языке PHP
Fix Severity: 8192 Message: Creation of dynamic property CI_URI::$config is deprecated CodeIgniter
PHP и PhpMyAdmin — создание, вывод, изменение и удаление данных
Удаление записей из базы данных с помощью GET запроса в PHP