在标记中为每个表添加类名

时间:2018-04-10 21:51:31

标签: php regex

在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);
}

3 个答案:

答案 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();

Live demo

RegEx解决方案,不是首选

$counter = 0;
echo preg_replace_callback('~<table\K>~', function() use (&$counter) {
    return ' class="table_' . $counter++ . '">';
}, $content);

Live demo

答案 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; 

演示https://onlinegdb.com/B1kumZjjf