Regex - Greedyness - соответствующие HTML-теги, контент и атрибуты - PullRequest
0 голосов
/ 11 марта 2011

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

Ответы [ 3 ]

5 голосов
/ 11 марта 2011

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


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

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

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

1 голос
/ 11 марта 2011

Просто добавив ? , я думаю

/(<span lang="(.*?)">(.*?)</span>)/is
1 голос
/ 11 марта 2011

Вы можете указать это как нелюбовь, используя ?

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

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

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

...