这是我目前正在处理的一个奇怪的扳手。我已经反复使用了它,使用了各种正则表达式、空格和引号变体,但似乎只存在结束</a>
标记的位置问题。
我已经构建了一个RegEx解析器(我知道),从HTML输出中获取标记,并从我们称之为"短代码"的库中为每个标记触发自定义闭包。它只需要将标记换成闭包的返回值,如果闭包不存在,则保留标记。
当</a>
与我正在抓取的标签放在同一行时,它会导致preg_replace_callback
失败。当我添加换行符时,一切都可以完美地工作。我们到处使用这些标签作为模板系统的核心部分,它们在其他所有实例中都能很好地工作。
所以我的问题是…为什么?!这是虫子还是我是虫子?
编辑:更新模式以限制不情愿。关闭</a>
标记仍然会终止进程。(@Alan Moore)
编辑2:所以,regex是罪魁祸首。在某些情况下,它将内容拉到同一行的标签之外,但这种模式解决了问题——'#'['s*('w[^']'s]*)(.*?)'s*']#i'
。
失败的HTML
<div>
<a href="[ make_url post_id='200' ]">Some Link</a>
</div>
成功的HTML
<div>
<a href="[ make_url post_id='200' ]">
Some Link
</a>
</div>
或
<div>
<a href="[ make_url post_id='200' ]">Some Link
</a>
</div>
PHP
没有什么新奇的东西,即使我把它简化到最基本的东西,它仍然失败了。
$content = 'HTML output from an output buffer';
//$old_pattern = '#'['s*?('w+?(?:'.?'w+?)*?(?='s|']))(.+)*?'s*?']#i';
$pattern = '#'['s*('w+(?:'.?'w+)*(?='s|']))(.+)'s*']#i';
$content = preg_replace_callback( $pattern, function( $matches ) {
// Do things with the matches
}, $content );
// Send content back to the template
return $content;
Ummm做了一些像这样基本的事情不适合你吗?
/<a.*?('[.*?']).*?>.*?<'/a>/is
例如
$matches = null;
$result =
preg_match_all('/<a.*?('[.*?']).*?>.*?<'/a>/is', '
<div>
<a href="[ make_url post_id=''200'' ]">Some Link</a>
</div>
<div>
<a href="[ make_url post_id=''200'' ]">
Some Link
</a>
</div>
<div>
<a href="[ make_url post_id=''200'' ]">Some Link
</a>
</div>
', $matches);
var_dump($matches);
http://codepad.viper-7.com/PM70m1
事实证明正则表达式是罪魁祸首。在某些情况下,它将内容拉到同一行的标签之外,但这种模式解决了问题——#'['s*('w[^']'s]*)(.*?)'s*']#i
。