2

現在、BBCode から URL を取得しようとしています。それには4つの可能性があり、それが私の現在の問題です:

[url]http://stackoverflow.com/[/url]
[url='http://stackoverflow.com/']http://stackoverflow.com/[/url]
[url="http://stackoverflow.com/"]http://stackoverflow.com/[/url]
[url=http://stackoverflow.com/]http://stackoverflow.com/[/url]

両方必要です。これは、私がこれまでに持っているものです:

/\[url(?:\=\'([^\'"]+)\')?](.+?)\[\/url]/i

しかし、それはケース1と2でのみ機能します。

編集:

これはよりうまく機能します:

/\[url(?:\=(?:[\"|'])?(.*)(?:[^[]+)?)?\](.*)\[\/url\]/i

しかし、まだ完璧ではありません。

編集:

私はそれを手に入れたと思います。最適化が必要かもしれませんが、うまくいくようです:

/\[url(?:\=("|\'|)?(.*)?\1)?\](.*)\[\/url\]/i

正規表現テスターを参照

4

2 に答える 2

4

次のパターンを使用できます。

$pattern = '~\[url(?|=[\'"]?([^]"\']+)[\'"]?]([^[]+)|](([^[]+)))\[/url]~';
$replacement = '<a href="$1">$2</a>';

$result = preg_replace($pattern, $replacement, $subject);

アイデアは、分岐リセット機能を使用して、交互の各分岐のグループ番号を保持することです。このように、グループ 1 には常に URL が含まれ、グループ 2 にはリンクの説明が含まれます。説明がない場合は、URL が代わりに使用されます。そのため、URL は 2 番目のブランチのキャプチャ グループで 2 回囲まれています。

于 2013-07-07T01:04:59.840 に答える