Обрезать / стереть / удалить ссылки из строки с помощью регулярного выражения - PullRequest
0 голосов
/ 21 сентября 2011

У меня очень простой вопрос, который ... дает мне хедач ...

Я просто хочу обрезать все ссылки (www.link.com) (http://www.link.com) (http://link.com))... в зависимости от заданной строки с этим регулярным выражением:

$regex = "(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?";

Просто включите их в пробел.

Это мой действительный код, который не будет работать ...

<?php

$string = 'ads dsa asd asd as da ds www.something.com adss dsad a sdas d';
$pattern = "(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&amp;/~\+#]*[\w\-\@?^=%&amp;/~\+#])?";

$replacement = ' nothing ';
echo preg_replace($pattern, $replacement, $string);

?>

мне постоянно говорят, что

    ( ! ) Warning: preg_replace() [function.preg-replace]: Unknown modifier ':' in C:\wamp\www\ceva.php on line 9
    Call Stack
    #   Time    Memory  Function    Location
    1   0.0005  363504  {main}( )   ..\ceva.php:0
    2   0.0005  363952  preg_replace ( )    ..\ceva.php:9

Буду признателен за любую помощь: D

Ответы [ 4 ]

2 голосов
/ 22 сентября 2011

Шаблоны для регулярных выражений в php должны быть окружены разделителем, чтобы показать, где шаблон начинается и останавливается, и запускаются модификаторы (без учета регистра, многострочные ... и т. Д.).Чаще всего вы видите косую черту в качестве разделителя, но в большинстве случаев подойдет любой символ.Примером скороговорки может быть: /pattern[a-z]*/i.Обратите внимание, что первый символ является косой чертой (/), а сам шаблон заканчивается тем же символом (/), и после этого ожидаются только модификаторы, такие как i для нечувствительного к регистру..тек (см .: * 1005)* Модификаторы ).Каким бы ни был первый символ, это разделитель, и часть шаблона должна заканчиваться тем же символом, что и конечный разделитель.Ошибка, которую вы видите, означает, что ваш первый символ, который является открытой скобкой, является разделителем.После следующей открытой скобки все, что после этого должно быть модификатором.Ошибка говорит о том, что после конечного разделителя есть недопустимый модификатор.Чтобы это исправить, вы должны иметь возможность просто поместить разделитель вокруг регулярного выражения, и он должен работать.См. Delimeters и общую справочную информацию о регулярных выражениях php .

Редактировать: Мне было интересно, почему вы получаете сообщение об ошибке двоеточия в качестве проблемного символа.Очевидно, php также поддерживает разделители в виде скобок, такие как { и }.При этом открытая скобка является разделителем, закрывающая скобка является конечным разделителем.Следующие символы, как ожидается, будут разделителями, и шаблон выдает ошибку, когда первый символ после закрывающего разделителя, двоеточие достигается, потому что это недопустимый модификатор.TIL.

0 голосов
/ 22 сентября 2011

Вы забыли разделители вокруг регулярного выражения:

вместо:

$pattern = "(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&amp;/~\+#]*[\w\-\@?^=%&amp;/~\+#])?";

попробовать:

$pattern = "/(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-.,@?^=%&amp;\/~\+#]*[\w\-@?^=%&amp;\/~+#])?/";

или

$pattern = "{(ftp|https?)://[-\w]+(\.[-\w]+)+([-\w.,@?^=%&;/~+#]*[-\w@?^=%&;/~+#])?}";
0 голосов
/ 22 сентября 2011

Это очень очень просто, но может быть достаточно, просто предполагается, что после ссылки есть пробел

<?php
    $string = 'here goes 1 http://google.com and 2 http://www.google.com and also 3 www.google.com?q=asd& and thats it';
    $pattern = '/((http|ftp|https):\/\/(www\.)?|www\.)[^\s]*/';
    $return = preg_replace($pattern, '<link>', $string);
    var_dump($return);
?>
0 голосов
/ 21 сентября 2011

Похоже, он недоволен двоеточием. Попробуйте использовать обратную косую черту в вашем регулярном выражении (поэтому поверните ":" в "\:".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...