Оставьте существующие сущности HTML как есть, но преобразуйте двойные и одинарные кавычки - PullRequest
0 голосов
/ 16 октября 2018

Я использую код PHP для генерации мета-тега описания, например:

<meta name="description" content="<?php
echo $this->utf->clean_string(word_limiter(strip_tags(trim($paperResult['file_content'])),27));
?>

Вот пример вывода мета-описания:

<meta name="description" content="blah blah &#182; &#8230; blah blah "words in quotation marks" blah blah "more words in quotation marks" blah blah" />

Два объекта HTML в этом мета-описании примера - это знак абзаца (&#182;), за которым следует многоточие (&#8230;).Они уже находятся в форме сущности HTML в исходном тексте, поэтому я хочу, чтобы они остались без изменений.Проблема в том, что мне также нужны кавычки в описании для преобразования в &quot;, чтобы предотвратить разрыв метатега.Каждая комбинация / конфигурация, которую я пробую, либо не работает, либо ломает мой сайт, потому что я неправильно понимаю код.Например, когда я пытаюсь использовать следующий код, кавычки преобразуются в их сущность HTML по желанию, но символ абзаца и многоточие прерываются, потому что символ амперсанда в начале существующих сущностей HTML преобразуется в &amp;.Это оставляет меня со сломанным &#182; (&amp;#182;) и сломанным &#8230; (&amp;#8230;):

 echo $this->utf->clean_string(word_limiter(htmlspecialchars(strip_tags(trim($paperResult['file_content']))),27));

Я пытался - буквально, в течение многих дней - понять это,Я много раз искал в переполнении стека, но безрезультатно.Мне просто нужно, чтобы существующие сущности HTML оставались неизменными, а кавычки преобразовывались в их сущность HTML (&quot;).Я изучил параметр ENT_QUOTES и знаю, что решение, вероятно, существует в нем, но я не могу понять, как включить его в мою конкретную строку кода.Я надеюсь, что вы, PHP-гуру, помилуете эту замученную душу!Я действительно ценю вашу помощь.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Если это содержимое атрибута "content", вы можете сделать это

$str = 'blah blah &#182; &#8230; blah blah "words in quotation marks" blah blah "more words in quotation marks" blah blah';
echo htmlentities($str, ENT_QUOTES, "UTF-8", false);

Вывод

blah blah &#182; &#8230; blah blah &quot;words in quotation marks&quot; blah blah &quot;more words in quotation marks&quot; blah blah

Песочница

Ключевым моментом здесь является 4-й аргумент

строка htmlentities (строка $ string [, int $ flags = ENT_COMPAT | ENT_HTML401 [, строка $ encoding = ini_get ("default_charset") [, bool $ double_encode = TRUE]]])

В частности

double_encode Когда double_encode выключен, PHP не будет кодировать существующие html-сущности.По умолчанию все конвертируется.

Таким образом, он не выполняет двойное кодирование амперсанда.

htmlspecialchars также имеет аргумент двойного кодирования.

htmlspecialchars (строка $ string [, int $ flags = ENT_COMPAT | ENT_HTML401 [, строка $ encoding = ini_get ("default_charset") [, bool $ double_encode = TRUE]]])

$str = 'blah blah &#182; &#8230; blah blah "words in quotation marks" blah blah "more words in quotation marks" blah blah';
echo htmlspecialchars($str, ENT_QUOTES, "UTF-8", false);

Вывод

blah blah &#182; &#8230; blah blah &quot;words in quotation marks&quot; blah blah &quot;more words in quotation marks&quot; blah blah

Песочница

Если это весь тег, вам придется извлечь содержимое и изменить его, а затем заменить так, чтобысохраните < и >, но в вопросе, если это так, неясно.

PS Нет большой разницы между htmlspecialchars и htmlentities, в основном оно имеетчтобы сделать с é accute и другими подобными акцентными вещами, htmlentities тоже их кодирует, если я правильно помню.

ОБНОВЛЕНИЕ

Мне нужно решениебыть включены в мой конкретный формат кода PHP (то есть, одна строка PHP, которая поддерживает мy существующие функции / функциональность), как блестяще сделал miken32 выше

Чтобы вставить его в свой код,

<meta name="description" content="<?=htmlspecialchars(word_limiter(trim($paperResult['file_content']),27),ENT_QUOTES,"UTF-8",false);?>"/>

UPDATE2

С preg_replace('/[\r\n]+/', ' ', $string) удаляет \r\n или \n один или несколько раз +.Но может быть лучше сделать это так preg_replace(['/[\r\n]+/', '/\s+/'], ' ', $string).Что также уберет пробел в пробелах.

 <meta name="description" content="<?=htmlspecialchars(word_limiter(preg_replace('/[\r\n]+/', ' ', trim($paperResult['file_content'])),27),ENT_QUOTES,"UTF-8",false);?>"/>

По сути, это все, что делает текст короче, чем вы, вероятно, захотите сделать до word_limiter (что бы это ни было).И любая вещь, которая делает его длиннее, например, изменение " на &quote;, которое вы, вероятно, захотите сделать после (возможно).Мне это кажется более логичным.

Ура!

0 голосов
/ 16 октября 2018

Я не могу быть уверен, так как вы не говорите нам, что делают все эти другие функции, но кажется, что вы могли бы просто сделать это:

<meta name="description" content="<?=htmlspecialchars(html_entity_decode(word_limiter($paperResult['file_content'], 27)))?>"/>

Так что ограничьте количество слов, включите любойобъекты в символы, а затем снова превращать любые специальные символы обратно в объекты.Нет необходимости удалять теги и тому подобное для безопасности, так как htmlspecialchars обеспечит безопасность любого вывода для включения в HTML.

...