正则表达式一起运行所有匹配而不是单独返回

时间:2014-11-04 23:02:09

标签: php regex preg-replace

我正在开发一个自定义cms的php脚本,它将用数据库中的信息替换自定义标记。

下面会有一个标签

<!-- NAV id="123" suffix="somethinghere" prefix="somethingelse" --> 

我需要提取id,suffix和prefix属性。如果页面上只有一个此标记的实例,但如果我有多个,或者“ - &gt;”,则下面的代码效果很好在页面上的任何其他位置它无法正常工作。它匹配第一个

之间的所有内容
"<!--"

和最后一次

"-->" 

而不是单独返回每个匹配。

这是我目前的代码。如果它正常工作,它将用“id”的值替换整个标记,最终将是数据库中的数据。

<?php
global $lastNav, $html;

//the html content
$html = '<html><body><hr><br>Hi this is my content<br> <!-- NAV id="123" suffix="<br />" prefix="&bull;" --> <br>Some more content here <!-- NAV id="125" suffix="<br />" prefix="&bull;" -->     </body></html>';

$regexNavPattern = '<!-- NAV.*?(?:(?:\s+(id)="([^"]+)")|(?:\s+(prefix)="([^"]+)")|(?:\s+(suffix)="([^"]+)")|(?:\s+[^\s]+))+.*-->';

preg_replace_callback($regexNavPattern, "parseNav", $html);
function parseNav($navData) {
    global $lastNav, $html;

    foreach($navData as $key=>$value) {
        if($key == 0) { $lastNav['replace'] = '<'.$value.'>'; }
        if($value == 'id')     { $lastNav['id']     = $navData[$key+1]; }   
        if($value == 'prefix') { $lastNav['prefix'] = $navData[$key+1]; }   
        if($value == 'suffix') { $lastNav['suffix'] = $navData[$key+1]; }   
    }

    $html = str_replace($lastNav['replace'], $lastNav['id'], $html);
}

echo $html;
?>

此时我并不关心区分大小写。属性可能包含特殊字符,包括单引号或双引号。

希望我能够很好地解释这一点。提前谢谢。

1 个答案:

答案 0 :(得分:0)

Jonathan Kuhn的解决方案奏效了。暂时我采用了第一种方法来纠正现有的正则表达式。

/<!-- NAV.*?(?:(?:\s+(id)="([^"]+)")|(?:\s+(prefix)="([^"]+)")|(?:\s+(suffix)="([^"]+)‌​")|(?:\s+[^\s]?+))+.*?-->/

稍后我会修改它以将其分解为一些功能。我很感激帮助。