Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
(PHP)如何找到以模式开头的单词并替换它们?_Php_Regex_String_Str Replace - Fatal编程技术网

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

(PHP)如何找到以模式开头的单词并替换它们?,php,regex,string,str-replace,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)将完整的“/r/x”替换为我的模式,最重要的是3)一次性完成所有“/r/”和“/u/”匹配 我知道的唯一方法是编写

我有一根绳子。例如,“联系/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)将完整的“/r/x”替换为我的模式,最重要的是3)一次性完成所有“/r/”和“/u/”匹配

我知道的唯一方法是编写一个函数,逐个字符遍历字符串,直到找到“/”,然后查找后面的“r”和“/”;然后继续走直到我找到一个空间。这将给我开始和结束字符,所以我可以做一个字符串替换;然后计算新的端点,并继续遍历字符串


这感觉。。。哑的我觉得有一种相对简单的方法可以做到这一点,我只是不知道如何用谷歌搜索所有相关部分。

一个简单的
preg\u replace
就可以了

尝试:

以下是一个例子:


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

我认为,对于这样一个简单的操作来说,正则表达式是一种过分的操作。如果您只想将“/r/x”的实例替换为“
”[r/x](http://reddit.com/r/x)“
和“/u/x”与“
”[/u/x](http://reddit.com/u/x)“
您应该使用
str\u replace
尽管使用preg\u replace会减少代码

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

对复杂的搜索字符串使用正则表达式并替换。如果要在字符串中捕获复杂的内容,也可以使用正则表达式生成器

您正在寻找正则表达式

基本模式以固定字符串开始<代码>/u/或
/r/
将与这些完全匹配。这可以简化为将一个或另一个与
/(?:u | r)/
匹配,后者将与这两个模式匹配。接下来,您需要匹配从该点到空间的所有内容。您可以使用负数字符组
[^]
,它将匹配任何非空格字符,并应用修饰符
*
,以匹配与该组匹配的尽可能多的字符<代码>/(?:u|r)/[^]*


您可以进一步使用该模式并添加一个lookback,
(?您是否尝试使用
regex
?您应该了解称为正则表达式(regex)的概念)我对正则表达式的了解是非常基本的。我看到一个建议的答案,它为正则表达式提供了一个可能有效的建议。我没有意识到正则表达式可能会起作用。真的正则表达式是一个噩梦。我的意思是,令人惊讶。令人惊讶。完全不是噩梦。-)谢谢,我会试试这个。我没有意识到正则表达式可以做我想做的事情。我知道regex会很棒,但是yeesh。我看到你认为regex是一场噩梦。我记得当我试图学习它的时候,我发现它其实并没有那么糟糕。通过做发现。这是我在一个在线正则表达式工具中的正则表达式,我觉得非常宝贵。它解释了当您将鼠标悬停在正则表达式字符串的部分上时的所有组件:必须添加这样的结束参数:$string=preg_replace('#(/(?:u|r)/[a-zA-Z0-9_-]+)#','$string);非常有效,非常感谢!该示例表示
/r/
/u/
后面的部分是变量,是正则表达式的完美示例。什么变量?也许我在问题中漏掉了=/他的示例字符串暗示他有
“联系/u/reddit上的某人,或访问/r/subreddit或/r/subreddit2”
,然后简单地用
/r/x
引用它,其中
x
是变量。我为没有很好地表达这一点表示歉意-我倾向于冗长,所以我试图不冗长,而且做得太过分了。事实上,它必须匹配一个变量。一对夫妇展示的正则表达式解决方案非常完美,极大地扩展了我对正则表达式的理解。:)当我可以投票时,我会投票支持这个答案。谢谢你的解释,非常有用。在那之后,我对正则表达式的恐惧(恐惧?)明显减少了。太棒了。在另一个答案的评论中说的是,从一开始就很吓人。在实践中学习是一种很好的方式。理解术语及其用途将有所帮助,然后您可以找出搜索什么来发现语法。
str_replace("/r/x","[/r/x](http://reddit.com/r/x)","whatever_string");