1

人の名前が二重括弧で囲まれたコンテンツのブロックがあります。例えば:

Lorem ipsum dolor sit amet, consectetur [[Jane Doe]] adipisicing elit, sed do eiusmod tempor incididunt ut labe et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud execitation ullamco [[John Doe]] laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Exceptioneur sint occaecat cupidatat non proident, [[Susan Van-Something]] sunt in culpa qui office deserunt mollit anim id est labum.

二重括弧から名前を取り出し、コンテンツ内のそれらを以下のフォーマットに従ったリンクに置き換える正規表現を作成しようとしています:

<a href='http://www.example.com/jane-doe/'>Jane Doe</a>

URL では、スペースがハイフンに変換され、名前全体が小文字になります。

これまでのところ、私は持っています

// the filter function
function names_brackets( $content ) {
    // regex replace the names with links
    // return the content
    return preg_replace_callback( "/^([[[A-Za-z0-9- ]+?]])/" , "names_callback" , $content);
}

// callback function to allow post processing
function names_callback ( $matches ) {
    $find = array(' ', '[', ']');
    $replace = array('-', '', '');
    return '<a href="http://www.example.com/' . strtolower( str_replace($find, $replace, $matches[1]) ) . '">' . str_replace(']', '', str_replace('[', '', $matches[1])) . '</a>';
}

残念ながら、正規表現に問題があると思われます。どんな助けでも大歓迎です。

4

3 に答える 3

1

リテラル ブラケットをエスケープし、文字列開始アンカーを削除する必要があります。

"/(\[\[[A-Za-z0-9 -]+\]\])/"
于 2012-12-12T17:22:00.703 に答える
0

あなたのパターンは少しずれています-とりわけ、次のように括弧をエスケープする必要があります。

/(\[\[[A-Za-z0-9\s]+\]\])/

... [[空白を含むテキスト]] を探します

必要に応じてグループを調整します。

于 2012-12-12T17:23:33.343 に答える
0

パターン内のブラケットをエスケープする必要がありますが、まだ改善の余地があります。実際には、複数のキャプチャ グループを使用する場合、コールバック関数内で別の検索と置換を行う必要はありません。ここみたいに:

function names_brackets( $content ) {
    return preg_replace_callback('/(\[\[)([\w -]+?)(]])/',
               'names_callback', $content);
}

function names_callback ( $matches ) {
    return '<a href="http://www.example.com/' 
           . strtolower(str_replace(' ', '-', $matches[2])) 
           . "\">$matches[2]</a>";
}

この方法では、開き括弧と閉じ括弧の両方が結果から切り取られますが、コールバック関数はそれらについて知る必要さえありません: 2 番目のグループ (名前を持つグループ) のみを使用します。

于 2012-12-12T17:26:22.220 に答える