0

私はこの2つの文字列を持っていて、それをhtmlタグに変更したい

1 : bq. sometext /* bq.+space+sometext+space or return

この文字列で、bq.+スペースで始まり、スペースまたはリターンで終わるこれに変換したい

<blockquote author="author" timestamp="unix time in secs">sometext</blockquote>

この文字列で

2:  [quote author="author" date="unix time in secs"]
    some text
    [/quote] /* start with [qoute and get the text of author property then get
                sometext form between ']' and '[/qoute]

私はそれらをこれに変換したい:

<blockquote author="author" timestamp="unix time in secs">sometext</blockquote>

この正規表現は機能しません!:

#\bq(.| )(.*?)\n#
4

1 に答える 1

0

あなたはそこにあなたの脱出を少し混乱させています。をエスケープbすると、単語の境界になります。をエスケープしない.と任意の文字に.なり、スペースを交互に入れると「...または...」を意味します。この正規表現は、最初の例を処理する必要があります。

$str = preg_replace(
    '#bq\. (\S+)#',
    '<blockquote author="author" timestamp="unix time in secs">$1</blockquote>',
    $str
);

2つ目は、誰かがこれをquoteマークアップでネストした場合に問題を引き起こします。quotesしかし、との間に他に何もないと仮定する[quote...][/quote]、次のようなものを使用できます。

$str = preg_replace(
    '#\[quote(?=[^\]]*author="([^"]*))(?=[^\]]*timestamp="([^"]*))[^\]]*\](.*?)\[/quote\]#s',
    '<blockquote author="$1" timestamp="$2">$3</blockquote>',
    $str
);

これは、2つの先読みを使用して属性を検索し、キャプチャグループ$1との値をキャプチャします$2。そして、文字列内の実際の位置を進めることなく、これらすべてを行います。先読みの良い点は、これが2つの属性のいずれにも関係なく機能することです。次に、残りの開始タグを一致させてから、.*?に遭遇するまでキャプチャをできるだけ少なくします()[/quote]

作業デモ。

于 2012-11-19T18:07:58.977 に答える