2014-02-18 2 views
1

My CMS позволяет заменять ключевые слова PHP, и в настоящее время я создаю формат для возврата первого элемента элемента в поле данных, которое обычно содержит неупорядоченный список HTML, но часто могут содержать абзацы и т. д.Regex соответствует только одному из перечисленных элементов в блоке HTML

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

Одним из серьезных ограничений является то, что я не могу использовать символ ^, так как моя CMS (досадно) использует этот символ для функций модификации.

До сих пор я только придумал: replace:<\/li>.*:</li></ul> - но это только замена закрывающего тега первого перечисленного элемента в возвращаемом блоке. Что мне действительно нужно что-то вроде:

replace:anything_that's_not_first_li_element:nothing 

Я понимаю, что этот вопрос очень длинный выстрел, так что спасибо заранее за все конструктивные ответы.

+0

Допускает ли это ссылки группы, такие как '$ 1' или' \ 1 'в заменяющей строке? – georg

+0

Насколько я знаю, он основан на возможностях PHP регулярного выражения, единственным ограничением является использование '^' –

+1

Но '\ A' работает? – georg

ответ

0

Вы можете использовать это регулярное выражение с флагом s.

(?<=<ul>).*?<li>.*?<\/li> 

Работа регулярок пример:

http://regex101.com/r/hL1zF0

PHP:

$list = '<ul> 
<li>first</li> 
<li>second</li> 
<li>third</li> 
<li>fourth</li> 
</ul>'; 

preg_match('/(?<=<ul>).*?<li>.*?<\/li>/s', $list, $matches); 

echo $matches[0]; 

Выходные:

<li>first</li> 
+0

@Bohemian, да. Флаг 's' - это флаг dotall. (или иначе известный как флаг одиночной линии). Это в моем ответе. :) – MElliott

Смежные вопросы