1

これは、私が現在扱っている奇妙なレンチです。さまざまな正規表現、スペース、引用符のバリエーションを使用して行ったり来たりしましたが、終了</a>タグの配置にのみ問題があるようです。

HTML出力からタグを取得し、「ショートコード」と呼ばれるもののライブラリからそれぞれのカスタムクロージャーをトリガーするRegExパーサーを構築しました(私は知っています)。クロージャーの戻り値のタグを交換するだけで、クロージャーが存在しない場合はタグをそのまま残します。

それ</a>が私がつかんでいるタグと同じ行に配置されると、preg_replace_callback失敗します。改行を追加すると、すべてが問題なく機能します。これらのタグは、テンプレート システムの中心部分としてあらゆる場所で使用されており、他のすべてのインスタンスでうまく機能しています。

だから私の質問は...なぜですか?! これはバグですか、それとも私がバグですか?

編集:不本意を制限するためにパターンを更新しました。</a>タグを閉じると、プロセスが強制終了されます。(@アラン・ムーア)

EDIT 2:したがって、正規表現が原因でした。場合によっては、同じ行のタグを超えてコンテンツを引き込んでいましたが、このパターンは問題を解決しました - '#\[\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;
4

2 に答える 2

0

うーん、これはあなたのために機能しないのと同じくらい基本的なことをしますか?

/<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

于 2012-09-13T01:05:43.203 に答える
0

正規表現が原因であることが判明しました。場合によっては、同じ行のタグを超えてコンテンツをプルしていましたが、このパターンで問題が解決しました- #\[\s*(\w[^\]\s]*)(.*?)\s*\]#i

于 2012-09-19T13:57:18.167 に答える