PHP: обтекание тегами абзаца - PullRequest
2 голосов
/ 02 января 2011

Мне нужно написать функцию PHP, которая удаляет открывающие и закрывающие теги абзаца из строки, но только если они находятся в самом начале / конце. Итак, строки:

"Simple Test"
"<p>Here</p>"
"<p>Test <p>Nested</p> Outside </p>"

Будет ли вывод:

"Simple Test"
"Here"
"Test <p>Nested</p> Outside"

Может ли HTMLPurifier сделать это или я должен использовать substr? Моя первая попытка была:

if(strpos($str,'<p>') === 0  && strcmp(substr($str,-1,4),'</p>'))
$str = substr($str,3,strlen($str)-4);

Ответы [ 4 ]

14 голосов
/ 02 января 2011

Это регулярное решение:

$str = preg_replace('!^<p>(.*?)</p>$!i', '$1', $str);
2 голосов
/ 02 января 2011

это регулярное выражение.

хорошо, если единственным требованием является удаление точных упаковочных строк <p> и </p>

если вам нужно универсальное решение, надежное для html, вы должны использовать DOM . (например, если вы хотите принимать классы, идентификаторы и различные атрибуты в тегах переноса абзаца.) но имейте в виду, что загрузка документа нормализует ваш html.

<?
$str = array(
"Simple Test",
"<p>Here</p>",
"<p>Test <p>Nested</p> Outside </p>"
);

foreach($str as $st) {
  echo $st." ---> ";
  if(preg_match('#<p>(.+)</p>#',$st,$match) === 1) { // 1 if matched, 0 if not matched
    $st = $match[1]; // if matched, replace our string by the match
  }
  echo $st."\n";
}

это сгенерирует вывод:

Simple Test ---> Simple Test
<p>Here</p> ---> Here
<p>Test <p>Nested</p> Outside </p> ---> Test <p>Nested</p> Outside 

Вы могли бы легко сделать один лайнер. например, с помощью обратных ссылок preg_replace и regex вы можете заменить строку, которая соответствует ... но я надеюсь, что в этой форме она более понятна для вас.

2 голосов
/ 02 января 2011

Регулярное выражение типа

</??p(?:\s+\w*)>

будет соответствовать вашему

и- используйте это регулярное выражение и замените совпадения строкой emtpy или чем угодно.

HTH

PS: используйте флаг "игнорировать регистр", на всякий случай.

Редактировать: сделать группу не захватывающей.

0 голосов
/ 02 сентября 2015

Не очень причудливый шаблон, но работает $inf = preg_replace('/<[\/]*?p.*?>/', '', $info);

...