これは、私が現在扱っている奇妙なレンチです。さまざまな正規表現、スペース、引用符のバリエーションを使用して行ったり来たりしましたが、終了</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;