Intereting Posts
Откройте страницу iframe в своем родителе, когда прямая ссылка относится к одной из дочерних страниц SyntaxError: JSON.parse: неожиданный символ в строке 1 столбца 2 JSON Как передать переменные, полученные в строке GET через перенаправление заголовка php? Ключи Laravel Array не сохранены Как написать регулярное выражение для соответствия бесплатной учетной записи электронной почты? Расположение заголовка PHP не работает должным образом Совместимость браузера jQuery (IE) Как использовать расширение PHP DOM loadHTML Как установить отношения «Жестокое» принадлежит ЧЕРЕЗ другую модель в Laravel? Как я могу изменить свой код для эхо-данных данных элемента child, где был найден мой поисковый запрос, в XMLReader? Почему не работает скрипт в WordPress? Представление IP-адреса в базе данных Maxmind Geolitecity отправка push-уведомлений на несколько устройств Android с использованием GCM Один длинный класс или несколько более коротких классов? Уточнение результатов поиска на основе фильтров

Regex – Greedyness – соответствие HTML-тегов, содержимого и атрибутов

Я пытаюсь сопоставить определенные теги span из источника HTML.

Атрибут lang и внутренний HTML тега используются в качестве параметров для функции, которая возвращает новую строку.

Я хочу заменить старые теги, атрибуты и контент результатом вызванной функции.

Субъект будет примерно таким:

<p>Some codesnippet:</p> <span lang="fsharp">// PE001 let p001 = [0..999] |> List.filter (fun n -> n % 3 = 0 || n % 5 = 0) |> List.sum </span> <p>Another code snippet:</p> <span lang="C#">//C# testclass class MyClass { } </span> 

Чтобы извлечь значение атрибута lang и содержимого, я группирую эти значения со следующим выражением:

 /(<span lang="(.*)">(.*)</span>)/is 

Поскольку регулярное выражение имеет тенденцию быть жадным, это выражение соответствует полному предмету, а не только одному тегу span и его содержимому.

Как мне удается сопоставить только один тег span?

Мы никогда не будем повторять его снова: не используйте регулярные выражения для работы с HTML!

Вместо этого используйте DOMDocument::loadHTML .

Это позволит вам манипулировать вашими данными HTML с помощью DOM, который намного мощнее и проще: вы сможете:

  • Используйте методы, такие как getElementById и getElementsByTagName для простых выделений,
  • Используйте класс DOMXPath чтобы сделать запросы XPath на вашем документе
  • Работа с DOMElement s и методы, такие как getAttribute / setAttribute

Действительно: найдите время, чтобы узнать DOM: это отличная инвестиция!

Вы можете указать, что он неровный ?

/(<span lang="(.*?)">(.*?)<\/span>)/is

или сделать все выражение неровным по умолчанию с помощью модификатора PCRE_UNGREEDY

/(<span lang="(.*)">(.*)<\/span>)/Uis

Просто добавление ? , Я думаю

 /(<span lang="(.*?)">(.*?)</span>)/is