Функция preg_replace для добавления строки ко всем гиперссылкам на странице - PullRequest
1 голос
/ 17 мая 2010

Я хочу добавить свое собственное значение ко всем гиперссылкам на странице ... например, если есть ссылки:

<a href="abc.htm?val=1">abc 1</a> <br/>
<a href="abc.htm?val=2">abc 1</a> <br/>
<a href="abc.htm?val=3">abc 1</a> <br/>
<a href="abc.htm?val=4">abc 1</a> <br/>

Я хочу добавить следующую переменную типа "type = int" ко всем гиперссылкам

вывод должен быть:

<a href="abc.htm?val=1&type=int">abc 1</a> <br/>
<a href="abc.htm?val=2&type=int">abc 1</a> <br/>
<a href="abc.htm?val=3&type=int">abc 1</a> <br/>
<a href="abc.htm?val=4&type=int">abc 1</a> <br/>

Я надеюсь, что это можно сделать довольно легко с помощью функции preg_replace

Ответы [ 4 ]

4 голосов
/ 17 мая 2010

Если просто добавить переменную в атрибут href, это сработает:

#                                              v-- &amp; instead of & for W3C validation
preg_replace('/(<a\\s+[^>]+href="[^"]*)(")/', '${1}&amp;type=int$2', $page_src);

Но если вам нужна устойчивость кода, в этом случае href="index.php" изменяется на href="index.php?type=int", а не href="index.php&type=int", тогда вам потребуется дополнительная проверка:

function process_link_matches ($matches) {
    # get rid of full matching string; all parts are already covered
    array_shift($matches);

    if (preg_match('/\\?[^"]/', $matches[2])) {
        # link already contains $_GET parameters
        $matches[1] .= '&type=int';
    } else {
        # starting a new list of parameters
        $matches[1] .= '?type=int';
    }

    return implode($matches);
}

$page_src = preg_replace_callback('/(<a\\s+[^>]+href=")([^"]*)("[^>]*>)/', 
    'process_link_matches', $page_src);
2 голосов
/ 17 мая 2010

Вы можете использовать выходной буфер и output_add_rewrite_var, чтобы сделать это. Возможно, вам придется настроить url_rewriter.tags , чтобы переписывать только атрибуты href a элементов.

1 голос
/ 17 мая 2010

Вы можете использовать

preg_replace('/(\<a [^>]*href=")([^"]*)"/i', '&\1\2type=int"', page);

Имейте в виду, что это может привести к поломке произвольных html-файлов. Я бы порекомендовал использовать Regex для манипулирования HTML только как одну операцию. Если вам нужно сделать это чаще или с большим количеством файлов, подумайте об использовании HTML-парсера.

0 голосов
/ 17 мая 2010

Я не эксперт по регулярным выражениям, но, похоже, вам следует подумать об использовании сессий или файлов cookie ...

...