2013-06-22 3 views
1

Учитывая эту строку текста:Regex, чтобы вытащить матч из упорядоченного списка

$myString = '<details class="myEl" open="open"> 
     <summary>In this article</summary> 
     <ol> 
       <li><a href="post-slug/">Introduction</a></li> 
       <li><a href="post-slug/2/">Title for the second page</a></li> 
       <li><a href="post-slug/3/">Title for the third page</a></li> 
     </ol> 
</details>'; 

Что бы регулярное выражение будет тянуть «Название для второй страницы», если я, учитывая, что матч для поиска является "/2/"?

Мне также нужно вытащить «Заголовок для третьей страницы», если совпадение было «/ 3 /», поэтому мне нужно общее регулярное выражение, которое вытащит строку между> и < после матча.

+0

Какова ваша партия? как вы его получите? – Brian

+0

Совпадение всегда будет состоять из двух косых черт «/ n /». Поэтому мне нужно начать там и искать строку между> и <после матча. – RegEdit

+0

** Не используйте регулярные выражения для анализа HTML **. Вы не можете достоверно разобрать HTML с регулярными выражениями, и вы столкнетесь с печалью и разочарованием в будущем. Как только HTML изменится с ваших ожиданий, ваш код будет сломан. См. Http://htmlparsing.com/php для примеров того, как правильно анализировать HTML с PHP-модулями, которые уже были написаны, протестированы и отлажены. –

ответ

2

Попробуйте это один:

preg_match('!\/' . $pageNo . '\/">(.*?)\<\/a\>!', $myString, $matches); 
$pageTitle = $matches[1]; 

Edit: Page 1 должен работать с этим:

preg_match('!\/' . ($pageNo == 1 ? ($pageNo . '\/') : '') . '">(.*?)\<\/a\>!', $myString, $matches); 
$pageTitle = $matches[1]; 
+0

. Лучше всего добавить полный запуск тега, чтобы ограничить риск ложных срабатываний. Но это должно сработать и действительно ответит на голосование – malko

+0

Проверка сейчас. Спасибо за помощь! Upvoted. – RegEdit

+0

Работает шарм +100 – RegEdit

0

Я думаю, что лучше использовать XPath, чтобы сделать такую ​​вещь, один пример будет:

$str = '<details class="myEl" open="open"> 
     <summary>In this article</summary> 
     <ol> 
       <li><a href="post-slug/">Introduction</a></li> 
       <li><a href="post-slug/2/">Title for the second page</a></li> 
       <li><a href="post-slug/3/">Title for the third page</a></li> 
     </ol> 
</details>'; 

$xml = simplexml_load_string($str); 
var_dump($xml->xpath('//details/ol/li/a[contains(@href, "/3/")]')); 

Но в отношении к Regex, следующее регулярное выражение может сделать работу:

preg_match_all('@<li><a href="post-slug/3/">((?:(?!<\/a>).)+)</a></li>@', $str, $matches); 
print_r($matches); 
+0

Regexp будет быстрее, чем загрузка строки с помощью simplexml – malko

+1

Я не говорю о производительности. Просто делитесь способами извлечения желаемой информации. –

+0

Хорошо, но вопрос был о regexp, и вы предполагаете, что xpath будет лучше. Это не относится к производительности и не относится к вопросу о op. + ваше решение работает только для индекса 3, а не в других случаях. – malko