我正在开发一个自定义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="•" --> <br>Some more content here <!-- NAV id="125" suffix="<br />" prefix="•" --> </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;
?>
此时我并不关心区分大小写。属性可能包含特殊字符,包括单引号或双引号。
希望我能够很好地解释这一点。提前谢谢。
答案 0 :(得分:0)
Jonathan Kuhn的解决方案奏效了。暂时我采用了第一种方法来纠正现有的正则表达式。
/<!-- NAV.*?(?:(?:\s+(id)="([^"]+)")|(?:\s+(prefix)="([^"]+)")|(?:\s+(suffix)="([^"]+)")|(?:\s+[^\s]?+))+.*?-->/
稍后我会修改它以将其分解为一些功能。我很感激帮助。