如何匹配多标签子字符串?

时间:2017-03-19 11:03:02

标签: php html substring preg-match

我似乎无法使用下面的代码获得我的预期结果(应该是"找到"),有人可以更正我的代码吗?我不断收到以下错误:

  

警告:preg_match_all():未知的修饰符'<'在第24行的C:\ xampp \ xampp \ htdocs \ lio \ lio2.php中   找不到

$content= file_get_contents('http://exampleonly.com');
$html ='
<a id="statusSectionTESTAUTOMATION" class="statusIcon">
<span title="Last build failed" class="aui-icon aui-icon-small aui-iconfont-error"><span>The last build was not built</span>
</span>
</a>';

if(preg_match_all($content, $html))
{
    echo "found";
} else {
    echo "not found";
}

我也尝试过使用这个例子,因为上面代码中的$content只是一个假人。我尝试将其应用于实时网址,而不是使用preg_match_all()我使用了stristr()

$content= file_get_contents('http://www.isitdownrightnow.com/');
$html =
'
<td style="height:50px;border-bottom:1px solid #D8DFEA;" valign="top"><div class="ts1"></div>
<a href="http://www.isitdownrightnow.com/netflix.com.html" style="font-weight:700;">
Netflix</a>
<div class="status" style="margin-top:3px;">
<span class="up"></span>Netflix.com is up. Checked 0 seconds ago.</div>
</td>
';
if(stristr($content, $html))
{
    echo "found";
} else {
    echo "not found";
}

3 个答案:

答案 0 :(得分:0)

preg_match_all用于检查模式是否存在。 使用stristr搜索字符串中的子字符串。

$content= file_get_contents('http://exampleonly.com');
$html ='
<a id="statusSectionTESTAUTOMATION" class="statusIcon">
<span title="Last build failed" class="aui-icon aui-icon-small aui-iconfont-error"><span>The last build was not built</span>
</span>
</a>';

if(stristr($content, $html))
{
    echo "found";
} else {
    echo "not found";
}

答案 1 :(得分:0)

您可以尝试strpos功能。

使用示例:

$content= file_get_contents('http://exampleonly.com');
$html ='
    <a id="statusSectionTESTAUTOMATION" class="statusIcon">
<span title="Last build failed" class="aui-icon aui-icon-small aui-iconfont-error"><span>The last build was not built</span>
</span>
</a>';

if (strpos($html, $content) !== false) {
    echo "found";
}else{
    echo "not found"; 
}

重要:谨慎使用!==而非!=

答案 2 :(得分:0)

我希望看到这个似乎被抛弃的问题找到解决方案,提供一些教育,并敦促一些最佳实践。

首先,为什么在preg_match_all()尝试时出现错误?这是因为函数期望第一个参数是正则表达式模式,并且您提供了一个文字字符串。要解决此错误,您只需在$html的值的两侧放置delimiters即可。在这个Demo中,您会看到我使用~而不是更受欢迎的/,因为这样可以避免不得不逃避&#34;模式本身中的/

$html='~
<a id="statusSectionTESTAUTOMATION" class="statusIcon">
<span title="Last build failed" class="aui-icon aui-icon-small aui-iconfont-error"><span>The last build was not built</span>
</span>
</a>~'

作为效率和最佳实践的问题,我应该声明,如果你只是检查子串是否存在,那么使用preg_match_all() - 搜索多次出现 - 是过度的。如果您的案例使用preg_match函数,请使用preg_match()

此外,我强烈建议您减少搜索文本。这是一个非常多的字符要搜索。

如果您在搜索文本的开头不需要换行符,请将其删除。如果在$html的开头或结尾有一个换行符(不可见的空白字符),但在$content中没有,则您将无法获得匹配。您\r\n\n之间的$content$html之间不匹配,或者因为您点击返回,完全可能会发生冲突在'开头$html之后,返回之后,'导致不匹配。

更深层次的问题是,您是否可以在保持准确性的同时搜索id="statusSectionTESTAUTOMATION"title="Last build failed"aui-iconfont-error

如果没有,这还够吗? id="statusSectionTESTAUTOMATION" class="statusIcon"> <span title="Last build failed" class="aui-icon aui-icon-small aui-iconfont-error"

如果您的搜索文本是文字和静态的,那么建议您使用非正则表达式解决方案。你似乎在寻找一个非常独特的子串,所以我不知道区分大小写是一个问题 - 你必须决定这个问题。

stristr() 是来自Sahil的错误建议(并且他已经在其他地方提出了这样的建议),因为它超过&#34;过度执行&#34;供您使用,效率低于stripos()。这些非正则表达式函数将逐字检查您的子字符串(当然,不需要前面提到的分隔符)。

Manish Joshi博士的代码段不正确因为它已经扭转了&#34; haystack&#34;和#34;针&#34; (这是一个容易犯的错误)。对于区分大小写的搜索,您可以准确使用以下内容:(Demo

$content='some text
    <a id="statusSectionTESTAUTOMATION" class="statusIcon">
<span title="Last build failed" class="aui-icon aui-icon-small aui-iconfont-error"><span>The last build was not built</span>
</span>
</a>some text';
$html ='<span title="Last build failed" class="aui-icon aui-icon-small aui-iconfont-error"><span>The last build was not built</span>';

if(strpos($content,$html)!==false){
    echo "found";
}else{
    echo "not found"; 
}
// output: found