【问题标题】:php Match and replacephp 匹配和替换
【发布时间】:2010-10-11 15:55:41
【问题描述】:

我想用字符串的修改版本替换我在字符串中找到的每个链接,例如:

敏捷的棕狐跳过http://www.google.com/?v=abchttp://www.google.com/?v=x_y-z
我将替换(并修改)其中的链接,使其变为:http://www.google.com/v/abchttp://www.google.com/v/x_y-z

我知道如何使用 preg_match_all($pattern, $text, $out, PREG_SET_ORDER); 找到所有链接 我可以使用 preg_split 等操作字符串 - 一次完成一个。

我正在寻找的结果是:

敏捷的棕狐跳过http://www.google.com/v/abchttp://www.google.com/v/=x_y-z
但是我怎样才能匹配和替换所有这些?任何帮助将不胜感激。

【问题讨论】:

  • http://www.google.com/v/=x_y-z中应该有=吗?
  • 不,我基本上想做的就是从 URI/?v=query 更改为 URI/v/query

标签: php html regex uri


【解决方案1】:

为此使用preg_replace

$str = preg_replace('/\?v=([^ ]*)/', '/v/$1', $str);

这假设您想要匹配?v= 之后的所有内容并将其放在/v/ 之后。如果不是这种情况,您必须更具体地了解模式是什么。

【讨论】:

  • Preg_replace 仅适用于它找到的第一个实例,我希望它适用于所有实例。
  • 不,preg_replace 适用于所有实例;问题是模式匹配什么。我已经编辑了我的答案以包含更具体的模式 - 只计算文本到下一个空格。
  • 啊,是的,你是对的。例如,现在假设您有两个 URI,例如 site.com/watch?v=xyzsite.com/?v=abc,您将如何匹配这两个(知道 watch 是可选的)。这两个都应该替换为site.com/v/xyzsite.com/v/abc
【解决方案2】:

使用 g(全局)和 i(不区分大小写)标志应该将搜索扩展到所有内容。

$string = preg_replace('/\?v=([^\s]+)/gi','/v/$1', $string);

这假设您的网址后有某种类型的空格。

【讨论】:

  • 嗨,如果 url 是 site.com/abc?v=xyz 之类的,你会怎么做——你会怎么做 abc?部分消失。即URI变为site.com/v/xyz而不是site.com/watch/v/xyz
  • 未知修饰符“g”是我尝试时得到的。
  • 啊,看起来 preg_replace 本质上是全局的。至于你的问题,在php中,它看起来像这样: preg_replace('/\/[^\?/]+\?([^=]+)=([^\s]+)/', '/ $1/$2', $string); - 这也将匹配 site.com/foo?bar=baz 并返回 site.com/bar/baz
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-09
  • 2017-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多