0

私はこのコードを持っています

function a($menu_item, $remove_link) {
    $pattern = 'class="(.+)"(.+)<a.+>(.+)</a>';
    if($remove_link) {
        return preg_replace($pattern, 'class="$1 selected"$2$3', $menu_item); //<- line 6
    }
    return $menu_item;
}

$remove_linkこれは基本的に真かどうかをチェックし、リンクを削除してクラス定義を追加します$menu_item

たとえば、私が使用する場合

$menu_item = '<li class="menuitem first"><a href="index.php">Home</a></li>';
$menu_item = a($menu_item, true);

返すべき

<li class="menuitem first selected">Home</li>;

正規表現はテストされており、Notepad ++ で動作しますが、私の関数は次のエラーを出しています:

Warning: preg_replace(): Delimiter must not be alphanumeric or backslash in functions.php on line 6

PHPパターンはスラッシュで「区切る」必要があることがわかったので、 class="/(.+)"(.+)<a.+>(.+)/</a>代わりに使用しようとしましたが、同じエラーが発生します。

私は何が欠けていますか?区切り記号を正しく使用するにはどうすればよいですか?

4

1 に答える 1

1

パターン区切り文字をパターンの最初と最後に配置する必要があります。例:

$pattern = '#class="(.+)"(.+)<a.+>(.+)</a>#';

#パターン内のすべてのスラッシュをエスケープすることを避けるよりも、これがより良い選択ですが、次/のように書くことができます:

$pattern = '/class="(.+)"(.+)<a.+>(.+)<\/a>/';

余談ですが、あなたのパターンは多くのバックトラックを引き起こします:

$pattern = '~class="([^"]+)"([^>]*>)<a[^>]+>([^<]+)</a>~';

より良く機能します。

+*はデフォルトで貪欲な量指定子であることを覚えておいてください(つまり、できる限りのことをします)。

ドットの代わりに制限された文字クラスを使用すると、量指定子の貪欲さを止めることができます。例

[^"]+を除くすべての文字を取得する"ため、 a が見つかったときに停止し"ます。

デモ:

<?php
function a($menu_item, $remove_link) {
    //$pattern = '~class="(.+)"(.+)<a.+>(.+)</a>~';
    $pattern = '~class="([^"]+)"([^>]*>)<a[^>]+>([^<]+)<\/a>~';
    if($remove_link) {
        return preg_replace($pattern, 'class="$1 selected"$2$3', $menu_item);
    }
    return $menu_item;
}

$menu_item = '<li class="menuitem first"><a href="index.php">Home</a></li>';
echo a($menu_item, true);
于 2013-08-25T16:14:04.360 に答える