Php 使用正则表达式提取链接

Php 使用正则表达式提取链接,php,regex,Php,Regex,我有一些特定的行将出现在一篇文章的文本区域中,我需要提取它们并将它们转换为链接。如果id只是一个数字,我从上一个示例获得的php代码可以正常工作,但是我现在需要它来处理url,该url可以包含字母、数字、破折号和前斜杠 $pattern = '/@\[([^\]]+)\]\(id:(\d+)\)/'; $replacement = '<a href="link/$2">$1</a>'; $text = preg_replace($pattern, $replacement

我有一些特定的行将出现在一篇文章的文本区域中,我需要提取它们并将它们转换为链接。如果id只是一个数字,我从上一个示例获得的php代码可以正常工作,但是我现在需要它来处理url,该url可以包含字母、数字、破折号和前斜杠

$pattern = '/@\[([^\]]+)\]\(id:(\d+)\)/';
$replacement = '<a href="link/$2">$1</a>';
$text = preg_replace($pattern, $replacement, $text);
$pattern='/@\[([^\]]+)\]\\\(id:(\d+)/;
$replacement='';
$text=preg_replace($pattern,$replacement,$text);
模式匹配除url之外的所有内容。如何将\d+更改为所需内容。我原以为我们可能成功了,但事实并非如此

@[Lucy Lawless](id:residential letting/landowns/view/lown/161)
将成为

@[200达利公园](id:residential lettings/properties/view/property/257)
将成为


@[Courrty](id:residential lettings/supplier/view/supplier/7)
将变成

如下更改您的正则表达式

@\[([^\[\]]+)\]\(id:([^()]*)\)
然后将匹配项替换为

[^()]*
匹配任何字符,但不匹配
零次或多次

$pattern = '~@\[([^\[\]]+)\]\(id:([^()]*)\)~';
$replacement = '<a href="$2">$1</a>';
$text = preg_replace($pattern, $replacement, $text);
$pattern='~@\[([^\[\]+)\]\\(id:([^()]*)\)~;
$replacement='';
$text=preg_replace($pattern,$replacement,$text);
尝试此操作。请参阅演示。替换为

刚刚将
\d+
更改为
*?\d+
,这样它就包含了
\d+
之前的所有内容

见演示

$re=“/\\[([^\]]+)\\]\\\(id:(.*?\\d+)\\)/m”;
$str=“[Lucy Lawless](id:residential lettings/Londowns/view/London/161)\n[200 Daly Park](id:residential lettings/properties/view/property/257)”;
$subst=“”;
$result=preg_replace($re,$subst,$str);

谢谢,这就是我现在使用的模式$pattern='/@[([^]]+])(id:([^()]*)/”<代码>匹配任何字符<代码>\d只匹配数字,
\w
匹配任何字母、数字或下划线。
\[([^\]]+)\]\(id:(.*?\d+)\)
$re = "/\\[([^\\]]+)\\]\\(id:(.*?\\d+)\\)/m";
$str = "[Lucy Lawless](id:residential-lettings/landlords/view/landlord/161)\n[200 Daly Park ](id:residential-lettings/properties/view/property/257)";
$subst = "<a href=\"link/$2\">$1</a>";

$result = preg_replace($re, $subst, $str);