Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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_Regex_String_Preg Match All - Fatal编程技术网

Php 从HTML文本中提取特定文本

Php 从HTML文本中提取特定文本,php,regex,string,preg-match-all,Php,Regex,String,Preg Match All,我对正则表达式不太熟悉。我正试图获得底部描述的结果。以下是我迄今为止所做的工作(请注意,$page包含制表器): 试试这个 <h1>(.*?)<span> /(.*?)/</span> (.*)/(.*)/ $1和$2是您预期的结果。我建议将DOM与trim一起使用,不需要正则表达式,下面是一个适用于您的具体案例的工作代码: $page = "<div class=\"title-container\">\n

我对正则表达式不太熟悉。我正试图获得底部描述的结果。以下是我迄今为止所做的工作(请注意,
$page
包含制表器):

试试这个

<h1>(.*?)<span> /(.*?)/</span>
(.*)/(.*)/

$1和$2是您预期的结果。

我建议将DOM与
trim
一起使用,不需要正则表达式,下面是一个适用于您的具体案例的工作代码:

$page = "<div class=\"title-container\">\n                            <h1>Text here<span> /Sub-text/</span> </h1>\n                                                     </div>";

$dom = new DOMDocument;
$dom->loadHTML($page);
$hs = $dom->getElementsByTagName('h1');
foreach ($hs as $h) {
    $enttitlenodes = $h->getElementsByTagName('span');
    if ($enttitlenodes->length > 0 && $enttitlenodes->item(0)->tagName == 'span')
    {
        $entitle = trim($enttitlenodes->item(0)->nodeValue, " /");
        echo $entitle . "\n";
        $h->removeChild($enttitlenodes->item(0)); 
    }
    $hutitle = $h->nodeValue;
    echo $hutitle;
}
$page=“\n此处文本/子文本/\n”;
$dom=新的DOMDocument;
$dom->loadHTML($page);
$hs=$dom->getElementsByTagName('h1');
foreach($hs作为$h){
$enttitlenodes=$h->getElementsByTagName('span');
如果($enttitlenodes->length>0&&$enttitlenodes->item(0)->标记名=='span')
{
$authentice=trim($enttitlenodes->item(0)->nodeValue,“/”;
echo$授权。“\n”;
$h->removeChild($enttitlenodes->item(0));
}
$hutitle=$h->nodeValue;
echo$hutitle;
}

请参见

DOMDocument::getElementsByTagName
返回的是
DOMNodeList
而不是数组,因此您不能在PHP5.6.3之前写入
$h->getElementsByTagName('span')[0]
,但
$h->getElementsByTagName('span')->项(0)
。这并不意味着它返回一个自php 5.6.3以来的数组,但只意味着您可以通过数组表示法访问项。@CasimiritHippolyte:我知道,我更新了代码,它现在甚至检查是否存在
标记。在这种情况下,它不使用count(设计用于计数数组项),使用属性
DOMNodeList::length
您能用非面向对象的方法编写这个吗?什么是min php版本5?@Gable:你的意思是你仍然坚持使用正则表达式解决方案吗?
/(.*)(.*)(.*)(.*)/
这两个版本都是相同的。安全的方式那样使用它很高兴帮助你。:)在你的记事本上试试这个+++(.*?/(.*?)/我想没有必要\/
<h1>(.*?)<span> /(.*?)/</span>
$page = "<div class=\"title-container\">\n                            <h1>Text here<span> /Sub-text/</span> </h1>\n                                                     </div>";

$dom = new DOMDocument;
$dom->loadHTML($page);
$hs = $dom->getElementsByTagName('h1');
foreach ($hs as $h) {
    $enttitlenodes = $h->getElementsByTagName('span');
    if ($enttitlenodes->length > 0 && $enttitlenodes->item(0)->tagName == 'span')
    {
        $entitle = trim($enttitlenodes->item(0)->nodeValue, " /");
        echo $entitle . "\n";
        $h->removeChild($enttitlenodes->item(0)); 
    }
    $hutitle = $h->nodeValue;
    echo $hutitle;
}