PHP, preg_match, регулярное выражение. Что я делаю не так?

StackOverflow https://stackoverflow.com/questions/1726455

  •  19-09-2019
  •  | 
  •  

Вопрос

Вот образец, с которым я хочу соответствовать:

<div class="class">
<a href="http://www.example.com/something"> I want to be able to capture this text</a>
<span class="ptBrand">

Это то, что я делаю:

$pattern='{<div class="productTitle">[\n]<((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+[\w\d:#@%/;$()~_?\+-=\\\.&]*)>([^\n]*)</a>[\n]<span class="ptBrand">}';

preg_match($pattern, $data, $matches,PREG_OFFSET_CAPTURE);

print_r($matches);

Он печатает:

Множество ( )

Это было полезно?

Решение

Как правило, регулярные выражения являются действительно плохим средством анализа HTML. Они ненадежны и, как правило, оказываются очень сложными. Гораздо более надежным решением является использование анализатора HTML. Видеть Parse HTML с PHP и DOM.

Что касается вашего выражения, я не вижу <div class="productTitle" В любом месте источника, поэтому я бы начал там. Точно так же вы пытаетесь проанализировать URL -адрес, но нет упоминания о якоре (прямо или через достаточный подстановочный знак), так что он там тоже потерпит неудачу. По сути, это выражение не похоже на HTML, который вы пытаетесь проанализировать.

Другие советы

... Или это:

preg_match('/\s*([^>]+)\s*<\/a/',$string,$match);

Объедините это тоже.

Шаблон:

/<div class="class">\s*<a href=\"([^"]+)\">([^<]+)</a>/m

Получить ссылку и текст примерно, но использование библиотеки DOM было бы гораздо лучшим методом.

Вы можете попробовать это:

<a href=".*?">([\s\S]*?)</a>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top