Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何获取HTML标记的内容?_Php_Html_Regex_Html Parsing - Fatal编程技术网

Php 如何获取HTML标记的内容?

Php 如何获取HTML标记的内容?,php,html,regex,html-parsing,Php,Html,Regex,Html Parsing,嘿,所以我想做的是把第一段的内容删掉。字符串$blog\u post包含许多以下格式的段落: <p>Paragraph 1</p><p>Paragraph 2</p><p>Paragraph 3</p> 第1段第2段第3段 我遇到的问题是,我正在编写一个正则表达式来获取第一个标记和第一个结束标记之间的所有内容。但是,它正在抓取第一个标记和最后一个关闭标记,这导致我抓取所有东西 这是我目前的代码: if (preg_mat

嘿,所以我想做的是把第一段的内容删掉。字符串
$blog\u post
包含许多以下格式的段落:

<p>Paragraph 1</p><p>Paragraph 2</p><p>Paragraph 3</p>
第1段

第2段

第3段

我遇到的问题是,我正在编写一个正则表达式来获取第一个
标记和第一个结束标记之间的所有内容。但是,它正在抓取第一个
标记和最后一个关闭
标记,这导致我抓取所有东西

这是我目前的代码:

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;
if(预匹配(“/[\\s]*[\\s]*(?[\\s\\s]+)[\\s]*[\\s]*/”,$blog\u post,$blog\u段落))
回声“”$blog_段落[“第一段”]。“

”; 其他的 echo$blog_post;
使用它查找第一个的位置可能更容易、更快

 <p>

首先

</p>

然后使用提取段落

 $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>'));
$paragration\u start=strpos($blog\u post,);
$paragration_end=strpos($blog_post,

,$paragration_start); $paragration=substr($blog\u post,$paragration\u start+strlen(“”),$paragration\u end-$paragration\u start-strlen(“”);

编辑:实际上,其他人答案中的正则表达式将更简单、更快。。。你在问题中的大而复杂的正则表达式把我弄糊涂了…

好吧,假设第一段中没有其他html,sysrqb将允许你匹配第一段中的任何内容。你可能想要更像这样的东西

<p>.*?</p>
*


放在
*
之后会使其不贪婪,这意味着在匹配

之前,它只匹配所需的少量文本。如果使用
preg\U match
,请使用“U”标志使其不贪婪

preg_match("/<p>(.*)<\/p>/U", $blog_post, &$matches);
preg_match(“/(.*)/U“,$blog_post,&$matches);

$matches[1]
将包含第一段。

使用正则表达式进行html解析永远不是正确的解决方案。对于这种特殊情况,您应该使用XPATH:

 $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>'));
$string = <<<XML
<a>
 <b>
  <c>texto</c>
  <c>cosas</c>
 </b>
 <d>
  <c>código</c>
 </d>
</a>
XML;

$xml = new SimpleXMLElement($string);

/* Busca <a><b><c> */
$resultado = $xml->xpath('//p[1]');
$string=