(PHP)如何找到以模式开头的单词并替换所有单词?

时间:2014-12-17 21:25:01

标签: php regex string str-replace

我有一个字符串。一个例子可能是"联系/ u / reddit上的某人,或访问/ r / subreddit或/ r / subreddit2"

我想替换" / r / x"的任何实例。和" / u / x"用" [/r/x](http://reddit.com/r/x)"和" [/u/x](http://reddit.com/u/x)"基本上。

所以我不确定如何1)找到" / r /"然后将其扩展到单词的其余部分(直到那里有一个空格),然后2)取满#34; / r / x"并用我的模式替换,最重要的是3)为所有人做这个" / r /"和" / u /"匹配一次......

我知道这样做的唯一方法就是写一个函数来逐字逐句地走字符串,直到找到" /",然后寻找" r"和" /"跟随;然后一直走,直到找到一个空间。这会给我开始和结束字符,所以我可以做一个字符串替换;然后计算新的终点,并继续走绳子。

这感觉......愚蠢。我有一种感觉,这是一种相对简单的方法,而且我不知道如何谷歌获取所有相关部分。

3 个答案:

答案 0 :(得分:0)

一个简单的preg_replace do what you want

尝试:

$string = preg_replace('#(/(?:u|r)/[a-zA-Z0-9_-]+)#', '[\1](http://reddit.com\1)', $string);

以下是一个示例:http://ideone.com/dvz2zB

您应该看看是否可以在Reddit名称或Reddit用户名中发现哪些字符有效,并相应地修改[a-zA-Z0-9_-]字符集。

答案 1 :(得分:0)

在我看来,正则表达式对于这样一个简单的操作来说太过分了。如果你只想替换" / r / x"的实例与"[r/x](http://reddit.com/r/x)"和" / u / x"使用"[/u/x](http://reddit.com/u/x)",您应该使用str_replace,尽管使用preg_replace它会减少代码。

str_replace("/r/x","[/r/x](http://reddit.com/r/x)","whatever_string");

使用正则表达式复杂的搜索字符串并替换。如果你在字符串中捕获了一些复杂的东西,你也可以使用http://www.jslab.dk/tools.regex.php正则表达式生成器。

答案 2 :(得分:0)

您正在寻找正则表达式。

基本模式以固定字符串开头。 /u//r/与这些完全匹配。这可以简化为与/(?:u|r)/匹配的一个或另一个匹配与这两个模式相同的[^ ]。接下来,您希望匹配从该点到空间的所有内容。您将使用负字符组*来匹配任何不是空格的字符,并应用修饰符/(?:u|r)/[^ ]*以匹配与该组匹配的尽可能多的字符。 (?<= )

您可以进一步采用该模式并添加一个lookbehind,(?<= )/(?:u|r)/[^ ]*以确保您的匹配前面有空格,因此您不匹配导致((?<= )/(?:u|r)/[^ ]*)的部分。您将所有这些包装成一个捕获组\1。这将捕获括号内的内容以允许替换模式。您可以使用[\1](http://reddit.com\1)对第一个捕获的群组的引用preg_replace来表达您选择的替换。

在php中,您可以将匹配模式,替换模式和主题字符串传递给{{1}}函数。