嗨,所以我想做的是抓住第一段的内容。 字符串$blog_post包含许多以下格式的段落:
1 2 3 4 5 6 7
| <p>
Paragraph 1
</p><p>
Paragraph 2
</p><p>
Paragraph 3
</p> |
我遇到的问题是我正在编写一个正则表达式以捕获第一个
标记和第一个结束的
标记之间的所有内容。 但是,它正在抓取第一个
标签和最后一个关闭的
标签,这导致我抓取了所有内容。
这是我当前的代码:
1 2 3 4 5 6 7
| if (preg_match("/[\\\\s]*<p>
[\\\\s]*(?<firstparagraph>[\\\\s\\\\S]+)[\\\\s]*<\\\\/p>[\\\\s\\\\S]*/",$blog_post,$blog_paragraph))
echo"<p>
" . $blog_paragraph["firstparagraph"] ."
</p>";
else
echo $blog_post; |
好吧,假设该段中没有其他html,sysrqb可以让您匹配第一段中的任何内容。 您可能想要更多这样的东西
将?放在*之后会使它变得不贪心,这意味着在匹配
之前,它只会匹配所需的尽可能少的文本。
如果使用preg_match,请使用" U"标志使其不贪婪。
1 2
| preg_match("/<p>
(.*)<\\/p>/U", $blog_post, &$matches); |
$matches[1]然后将包含第一段。
使用strpos()来查找第一个的位置可能会更容易,更快。
首先
然后使用substr()提取段落。
1 2 3 4 5 6 7
| $paragraph_start = strpos($blog_post, '<p>
');
$paragraph_end = strpos($blog_post, '
</p>', $paragraph_start);
$paragraph = substr($blog_post, $paragraph_start + strlen('<p>
'), $paragraph_end - $paragraph_start - strlen('<p>
')); |
编辑:实际上,其他人的答案中的正则表达式会更容易,更快...问题中您的大型复杂正则表达式使我感到困惑...
使用正则表达式进行html解析永远不是正确的解决方案。 对于这种特殊情况,您应该使用XPATH:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| $string = <<<XML
<c>texto</c>
<c>cosas</c>
<d>
<c>código</c>
</d>
XML;
$xml = new SimpleXMLElement($string);
/* Busca <c> */
$resultado = $xml->xpath('//p[1]'); |