0

これのために preg_replace を作成する方法が本当にわかりません:

[url="link"]title[!url]

私に与えます:

<a href="link">title</a>

私はこれを試していました:

$patterns = array();
$replacements = array();
$patterns[0] = '/\[b\]/';
$patterns[1] = '/\[\!b\]/';
$patterns[2] = '/\[url="([*]+)"\]([*]+)\[\!url\]/';
$replacements[0] = '<strong>';
$replacements[1] = '</strong>';
$replacements[2] = '<a href="$1">$2</a>';

echo preg_replace($patterns, $replacements, $text);

[b]、[!b] は問題なく動作します...しかし、[url] の問題は解決できません... :(

4

2 に答える 2

2

preg_replace('/\[url="(.+?)"\](.+?)\[\!url\]/', '<a href="$1">$2</a>', $string)

これは、無効な URL 文字をチェックしたくないことを前提としています。あなたの例では、URL で有効な多くの文字を取得できず、求めている機能が壊れています。より完全なバージョンは次のとおりです。

preg_replace('/\[url="([A-Za-z0-9\-._~:\/?#[\]@!$@&()\'*+,;=%]+)"\](.+)\[\!url\]/', '<a href="$1">$2</a>', $string)実際には、より完全なRFC 3986準拠の正規表現です。

于 2013-02-07T18:10:58.027 に答える
1

文字の一致を括弧で囲むだけです

\[url="([a-z0-9A-Z_.-]+)"\]([a-z0-9A-Z\s_.-]+)\[\!url\]

質問編集後

これを試して

\[url="(.*?)"\](.*?)\[\!url\]
于 2013-02-07T18:08:28.127 に答える