我有一些 HTML 内容,我想替换一个标签:
<span class='c1'>MY TEXT</span>
并保留我的文字。我试过:
$result = preg_replace('/(<span class=\'c1\'>)(.*)(<\/span>)/', '$2', $my_string);
但是封闭标签仍然存在?你能帮我解释一下我的错误在哪里吗?我要提高自己!谢谢
我有一些 HTML 内容,我想替换一个标签:
<span class='c1'>MY TEXT</span>
并保留我的文字。我试过:
$result = preg_replace('/(<span class=\'c1\'>)(.*)(<\/span>)/', '$2', $my_string);
但是封闭标签仍然存在?你能帮我解释一下我的错误在哪里吗?我要提高自己!谢谢
尝试使用惰性匹配(.*?)
而不是贪婪匹配(.*)
。
贪婪匹配意味着它会在完成之前尽可能地匹配,所以如果你在</span>
某个地方有另一个,它会匹配那个。例如:
使用贪心匹配:
<span class='c1'>MY TEXT</span><span class='c1'>MY OTHER TEXT</span>
^--greedy match will go from here to here--^
使用惰性匹配:
<span class='c1'>MY TEXT</span><span class='c1'>MY OTHER TEXT</span>
^-lazy^ ^---lazy----^
尝试一下
$result = preg_replace('/(\<span class=(\'|\")?c1(\'|\")?\>)(.*)(\<\/span\>)/i', '$4', $my_string);
您的全匹配组可能消耗太多,而您</span>
从尾随内容中看到另一个。你应该试试
$result = preg_replace('/(<span class=\'c1\'>)(.*?)(<\/span>)/', '$2', $my_string);
它使用了一个不贪婪的全匹配 ( .*?
)。
使用Simple HTML DOM,它是处理 HTML 元素的最佳解决方案。
例子:
require_once('simple_html_dom.php');
$html = str_get_html('<span class="c1">MY TEXT</span>');
$text = $html->plaintext;
或者,如果您有一个完整的 HTML 文档(而不仅仅是一个 HTML 片段):
require_once('simple_html_dom.php');
$html = str_get_html('html goes here');
$text = $html->find('span.c1', 0)->plaintext; // Find text from first <span> with the class 'c1'
就这么简单。
这会给你完美的结果:
preg_match_all('/<span(.*?)class=\'c1\'>(.*?)<\/span>/', '$2', $my_string, PREG_PATTERN_ORDER);
for ($i = 0; $i < count($result[0]); $i++) {
echo $result[0][$i];
}