HTML标记位置结束preg_replace_callback


HTML Tag Position Ends preg_replace_callback

这是我目前正在处理的一个奇怪的扳手。我已经反复使用了它,使用了各种正则表达式、空格和引号变体,但似乎只存在结束</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