Удалите все знаки препинания из строки PHP для дружественного SEO URL

Итак, я видел множество "решений" на этом сайте, но ни одно из них, похоже, не работает для меня полностью. Я хотел бы убрать все знаки препинания из названия поста, чтобы система могла динамически создавать 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-код для амперсанда и одинарную кавычку. Есть идеи?!?

2 ответа

Решение

Похоже, данные проходят через htmlspecialchars() или же htmlentities() где-то. Отменить это с htmlspecialchars_decode() или же html_entity_decode() первый:

$return = trim(preg_replace('/[^a-z0-9]+/i'," ", strtolower(htmlspecialchars_decode($post_name))));
/**
  * 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

@увидеть

Другие вопросы по тегам