正则表达式需要匹配p标签内的任何内容

geo*_*310 4 regex

我需要一个正则表达式来匹配<p>标签内的任何内容,例如,如果我有一些文本:

<p>Hello world</p>
Run Code Online (Sandbox Code Playgroud)

正则表达式将匹配Hello world部分

xzy*_*fer 8

在javascript中:

var str = "<p>Hello world</p>";
str.search(/<\s*p[^>]*>([^<]*)<\s*\/\s*p\s*>/)
Run Code Online (Sandbox Code Playgroud)

在PHP中:

$str = "<p>Hello world</p>";
preg_match_all("/<\s*p[^>]*>([^<]*)<\s*\/\s*p\s*>/", $str);
Run Code Online (Sandbox Code Playgroud)

这些将匹配像这样复杂的东西

< p style=  "font-weight: bold;" >Hello world  <  /  p >
Run Code Online (Sandbox Code Playgroud)

  • 如果里面有标签,则失败,如`&lt;p&gt;我想要&lt;b&gt;所有&lt;/b&gt;文本!&lt;/p&gt;`。 (4认同)

小智 7

看来上述提出的解决方案要么会失败:

  • <p>...</p>每当标签内包含其他标签(如<a>、等)时返回标签内的文本<em>,或者
  • 区分<p><path>
  • 包含具有以下属性的标签<p class="content">

考虑使用这个正则表达式:

<p(|\s+[^>]*)>(.*?)<\/p\s*>

生成的文本将在组 2 中捕获。


</p>显然,每当关闭标签由于某种原因包含在注释标签中时,此解决方案将无法正常工作<p> ... <!-- ... </p> ... -->


Kim*_*ais 5

编辑:不要这样做.只是不要.

看到这个问题

如果你坚持,使用<p>(.+?)</p>,结果将在第一组.它并不完美,但HTML解析问题的regexp解决方案永远都不会.

例如(在python中)

>>> import re
>>> r = re.compile('<p>(.+?)</p>')
>>> r.findall("<p>fo o</p><p>ba adr</p>")
['fo o', 'ba adr']
Run Code Online (Sandbox Code Playgroud)

  • 无法匹配`<p>空格在标签中有效</ p>` (2认同)