preg_replace все "_" пробелами только в URL - PullRequest
0 голосов
/ 30 января 2019

У меня есть HTML-файл, содержащий некоторые данные, включая некоторые URL-адреса.

Только в этих URL-адресах я хочу заменить символ _ на пробел (через файл php).

Таким образом, URL-адрес, подобный следующему:

</p><p><a rel="nofollow" class="external text" href="http://10.20.0.30:1234/index.php/this_is_an_example.html">How_to_sample.</a>

станет

</p><p><a rel="nofollow" class="external text" href="http://10.20.0.30:1234/index.php/this is an example.html">How_to_sample.</a>

Это не должно влиять на _, которые не включены в URL.

Iдумаю, что это возможно с помощью preg_replace, но я не знаю, как это сделать.

Следующий код неверен, поскольку он заменяет каждый _, а не только тот, что в URL.

$content2 = preg_replace('/[_]/', ' ', $content);

Спасибо.

РЕДАКТИРОВАТЬ:

Спасибо за предложение preg_replace_callback, это то, что я искал.

    // search pattern
    $pattern = '/href="http:\/\/10.20.0.30:1234\/index.php\/(.*?).html">/s';

    // the function call
    $content2 = preg_replace_callback($pattern, 'callback', $content);

    // the callback function
    function callback ($m) {
        print_r($m);
        $url = str_replace("_", " ", $m[1]);
        return 'href="http://10.20.0.30:1234/index.php/'.$url.'.html">';
    }

1 Ответ

0 голосов
/ 30 января 2019

Если вы открыты для некоторых хитростей регулярных выражений, вы можете выполнить свою задачу с помощью только preg_replace().

Код: ( Демо )

$input = '</p><p><a rel="nofollow" class="external text" href="http://10.20.0.30:1234/index.php/this_is_an_example.html">How_to_sample.</a>';

$pattern = '~(?:\G|\Qhttp://10.20.0.30:1234/index.php\E[^_]+)\K_([^_.]*)~';

echo preg_replace($pattern, " $1", $input);

Вывод:

</p><p><a rel="nofollow" class="external text" href="http://10.20.0.30:1234/index.php/this is an example.html">How_to_sample.</a>

\G - метасимвол «продолжить».Это позволяет вам делать несколько последовательных совпадений после ожидаемой части URL.

\Q..\E говорит "буквально обрабатывать все символы между двумя точками - поэтому экранирование не требуется.

\K означает «перезапустить совпадение полной строки с этого момента».

Демонстрация паттернов

Поскольку вы создаете URL, я считаю, что вы должны заменить на %20.

Я полагаю, что мой шаблон должен отрицать начало строки после \G для лучших практик ...

$pattern = '~(?:\G(?!^)|\Qhttp://10.20.0.30:1234/index.php\E[^_]+)\K_([^_.]*)~';
...