在PHP中,我需要搜索我的$ post内容并找到所有开放的<table>
标签,以根据其索引添加唯一的类名。我知道下面的代码是错误的,但希望得到重点。
$content = '<table></table><p></p><table></table><p></p><table></table><p></p>';
preg_match_all('/find all <table> tags/', $content, $matches);
for ($i=0; $i < count($matches); $i++) {
$new_value = '<table class=""' . $i . ' >';
str_replace( $matches[$i], $new_value, $content);
}
答案 0 :(得分:2)
更好的方法是使用DOM解析器。使用正则表达式,您可以轻松完成这项简单的任务,但为了正确的工具,请使用解析器:
$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
libxml_use_internal_errors(false);
$tables = $dom->getElementsByTagName('table');
foreach ($tables as $i => $table) {
$table->setAttribute('class', "table_$i");
}
echo $dom->saveHTML();
$counter = 0;
echo preg_replace_callback('~<table\K>~', function() use (&$counter) {
return ' class="table_' . $counter++ . '">';
}, $content);
答案 1 :(得分:1)
我个人会在没有正则表达式的情况下这样做。
$content = '<table></table><p></p><table></table><p></p><table></table><p></p>';
function str_replace_count($search, $replace, $subject, $count) {
return implode($replace, explode($search, $subject, $count + 1));
}
$i = 1;
while (strpos($content, '<table>') !== FALSE) {
$content = str_replace_count('<table>', '<table class="c_' . $i . '">', $content, 1);
$i++;
}
演示http://sandbox.onlinephpfunctions.com/
请记住,HTML标记类值不能以数字开头。
答案 2 :(得分:0)
您使用str.replace()
并且它将替换为不匹配,因此它将与<table>
匹配并全部替换它们,第二个循环将找不到任何匹配。
此答案Using str_replace so that it only acts on the first match?有一种解决方法,因此,您的代码应如下所示:
function str_replace_first($from, $to, $content)
{
$from = '/'.preg_quote($from, '/').'/';
return preg_replace($from, $to, $content, 1);
}
$content = '<table></table><p></p><table></table><p></p><table></table><p></p>';
preg_match_all('/<table>/', $content, $matches);
$result=$content;
foreach ($matches[0] As $key => $value) {
$new_value = '<table class=' . $key . ' >';
$result=str_replace_first($value, $new_value,$result);
}
echo $result;