Я пытаюсь сопоставить определенные теги 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