Получение содержимого тегов XHTML: p, ul и / или ol из строки - PullRequest
0 голосов
/ 12 января 2009

У меня есть CMS с редактором WYSIWYG, который производит довольно хороший xhtml. Исходя из этого, я думаю, что анализатор HTML может быть немного излишним для этой небольшой работы.

Я собираюсь использовать регулярные выражения, но до сих пор не смог заставить мои соответствовать тому, что я хочу.

Я использую PHP5.

Мне нужно сопоставить содержимое трех элементов уровня блока, которые редактор WYSIWYG может создать: p, ul & ol. Я использую preg_match_all () в настоящее время.

Кто-нибудь может мне помочь?

Спасибо

Ответы [ 3 ]

2 голосов
/ 12 января 2009

Это должно работать, если у вас нет вложенных тегов p / ul / ol:

preg_match_all("<(?:p|ul|ol)>(.*?)</(?:p|ul|ol)>", $string, $matches)

?: предотвращает включение чего-либо в скобках в $matches, а .*? предотвращает совпадение регулярного выражения после конца другого тега.

0 голосов
/ 12 января 2009

Это будет находить верхнюю часть каждого тега, если вы не вкладываете теги p в теги p или ul в ul. Но вы можете вложить p в ul, например. Для сложных HTML вы лучше с DOM .

Пример данных:

$html = <<< EOF
<p>
 hey
</p>

<ul>
 <li>
  test 
 </li>
 <li>
  <p>
   df4r4 4f4
  </p>
 </li>
</ul>

<p>
 hoo
</p>

EOF;

Regex:

$regex = '#<(?P<tags>(?i)p|ul|ol)>(?P<values>.*?)</\1>#si';
preg_match_all($regex, $html, $output);

Сортировать по тегам:

for ($i = 0, $t = count($output['tags']); $i < $t; $i++) {
    $out[$output['tags'][$i]][] = $output['values'][$i];
}

Теги и значения отдельно, удалите дубликаты с целочисленным ключом и совпадение всей строки:

$output = array_intersect_key($output, array('tags' => 0, 'values' => 0));
0 голосов
/ 12 января 2009

Кажется, я только что понял

preg_match_all('/<(p|ul|ol)>(.*)<\/(p|ul|ol)>/iU', $content, $blockElements);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...