php preg_replace каждый случай с другой строкой - PullRequest
0 голосов
/ 06 ноября 2018

Предположим, есть строка $comment = "I am tagging @abc and @def here".
Теперь я хочу заменить каждое слово, начинающееся с @, ссылкой, атрибут href и текст ссылки которого следующий за @ в слове. Пожалуйста, см. Пример ниже для получения дополнительной информации.
Например, @abc следует заменить на abc, а @def заменить на def в атрибуте href и тексте ссылки тоже.
Результат должен выглядеть примерно так: $comment = "I am tagging <a href='abc'>abc</a> and <a href='def'>def</a> here".
Я попробовал это, но я абсолютно чист от этого. Пожалуйста, прокомментируйте, если у вас есть какие-либо проблемы в понимании вопроса.
Заранее спасибо! :)

Ответы [ 3 ]

0 голосов
/ 06 ноября 2018

Вы используете регулярное выражение, чтобы найти весь текст, заканчивающийся границей слова (\b), которая начинается с @. Для каждого из них вы извлекаете текст после @ и создаете тег привязки следующим образом:

echo preg_replace_callback('/@.+?\b/', function($m) {
    $str = substr($m[0], 1);
    return sprintf("<a href='%s'>%s</a>", $str, $str);
}, $comment);
0 голосов
/ 06 ноября 2018

Вы можете выполнить замену с помощью одного поиска и заменить:

<?php

$string="I am tagging @abc and @def here";

$search='/\@(\w+)/';
$r='<a href="\1">\1</a>';

$s=preg_replace($search, $r, $string);

echo $s.PHP_EOL;

При запуске выдает:

$ php -f t.php 
I am tagging <a href="abc">abc</a> and <a href="def">def</a> here
0 голосов
/ 06 ноября 2018

Я бы использовал вариант обратного вызова preg_replace. Обратный вызов вызывается один раз для каждого совпадения. Помещение того, что вы на самом деле хотите использовать в качестве индекса ассоциативного массива в качестве сгруппированного соответствия, помещает его в качестве второго элемента в массиве $ match.

Например:

$res = preg_replace_callback( 
    "/@([a-z]+)/",
    function ( $matches ){
        $links = array( 'abc' => 'http://....abc', 'def' => 'http://....def' );
        return $links[ $matches[ 1 ] ];
    },
    "I am tagging @abc and @def here"
);

echo $res;
...