正则表达式在特定HTML标记内删除字符串

时间:2012-11-25 20:21:39

标签: php regex preg-replace

我正在尝试删除一个字符串,该字符串仅在使用cURL获取的页面上出现一次。例如:

<h3 class=" ">STRING IN QUESTION</h3>

<h3 class="active">STRING IN QUESTION</h3>

<h3 class=" active">STRING IN QUESTION</h3>

我想使用preg_match来做这件事,除非可以用资源消耗较少的方法完成。

这是我正在使用的正则表达式,它产生零结果:

<h3\sclass="\s">(.*?)</h3>

编辑:

以下是实际代码(此处使用的实际URL代替动态代码) - 发现当通过cURL提取时,class属性不存在,但仍然无法正常工作:

$ch = curl_init ("URL IN QUESTION"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$page = curl_exec($ch);

preg_match('<h3>(.*?)</h3>', $page, $match);

print_r($match);

什么都不打印

3 个答案:

答案 0 :(得分:3)

这就是诀窍:

$str='<h3 class=" ">STRING IN QUESTION</h3>';
preg_match('/<h3.*?>(.*?)<\/h3>/',$str,$match);
print_r($match);

输出:

Array
(
    [0] => <h3 class=" ">STRING IN QUESTION</h3>
    [1] => STRING IN QUESTION
)

说明:

<h3.*?> # Match h3 tags (non-greedy)
(.*?)   # Match everything after tag (non-greedy, captured)     
<\/h3>  # Match closing tag - Note the escaped forward slash!

但是,该网址不包含<h3>代码,但它确实包含<h1>代码,为了与之匹配,您需要使正则表达式匹配换行符s

preg_match('/<h1.*?>(.*?)<\/h1>/s',$page,$match);

输出:

Array
(
    [0] => <h1 class="">
<span class="pageTitle ">Braman Motorcars</span>
</h1>
    [1] => 
<span class="pageTitle ">Braman Motorcars</span>

)

答案 1 :(得分:1)

也许:

<h3\s+class="\s*(active)?">(.*?)</h3>

然后使用\1为“有问题的字符串”检索“有效”或“”和\2

我从来没有做过任何PHP,但也许这会有用吗?:

$result = "not found"
if (preg_match('#<h3\s+class="\s*(active)?">(.*?)</h3>#', $page, $match))
{
    $result = $match;
}
print_r($result)

答案 2 :(得分:0)

尝试:

preg_match('#<h3\s?class="\s?(active)?">(.+)</h3>#', $yourString, $match);

请记住,在正则表达式中,您必须始终提供delimiter