2

一部のコンテンツを解析して自家製のリンクタグを取得し、それを通常のリンクタグに変換するこの関数があります。

可能な入力:

<p>blabalblahhh <moolinkx pageid="121">text to click</moolinkx> blablabah</p>

出力:

<p>blabalblahhh <a href="whateverpage.htm">text to click</a> blablabah</p>

これが私のコードです:

$regex = '/\<moolinkx pageid="(.{1,})"\>(.{1,})\<\/moolinkx\>/';
preg_match_all( $regex, $string, $matches );

文字列に 1 つしかない場合は、完全に機能します。しかし、2 つ目があるとすぐに、それは機能しません。

入力:

<p>blabalblahhh <moolinkx pageid="121">text to click</moolinkx>  blablabah.</p>
<p>Another <moolinkx pageid="128">text to clickclick</moolinkx> again blablablah.</p>

それが私が print_r($matches) したときに得たものです:

Array
(
[0] => Array
    (
        [0] => <moolinkx pageid="121">text to click</moolinkx>  blablabah.</p><p>Another <moolinkx pageid="128">text to clickclick</moolinkx>
    )

[1] => Array
    (
        [0] => 121">text to click</moolinkx>  blablabah.</p><p>Another <moolinkx pageid="128
    )

[2] => Array
    (
        [0] => text to clickclick
    )

)

私は正規表現に慣れていないので、それは非常に些細なことに違いありません...しかし、それが何であるかを特定することはできません:(

事前にどうもありがとうございました!

注意: これは私の最初の投稿ですが、私はこの素晴らしい Q&A を何年も使用してきました!

4

2 に答える 2

1

負の正規表現を使用します。
$regex = '/<moolinkx pageid="([^"]+)">([^<]+)<\/moolinkx>/';

ここで説明されたデモ: http://regex101.com/r/sI3wK5

于 2013-03-05T10:55:15.240 に答える
1

最初の開始タグと最後の終了タグの間のすべてをタグ間のコンテンツとして認識している貪欲なセレクターを使用しています。正規表現を次のように変更します。

$regex = '/\<moolinkx pageid="(.+?)"\>(.+?)\<\/moolinkx\>/';
preg_match_all( $regex, $string, $matches );

.{1,}が に変わったことに注意してください.+?。は+1 つ以上のインスタンスを意味?し、式を満たすために可能な限り少ない文字を選択するように正規表現に指示します。

于 2013-03-05T10:30:29.003 に答える