【问题标题】:How can I replace the slash in this string?如何替换此字符串中的斜杠?
【发布时间】:2015-04-12 19:17:02
【问题描述】:

我有一个像这样的字符串: images/Qcuj/lXOSWNDwF/FmSgCbQ==.jpg

我想在images/ 之后将/ 替换为-

结果可能是:

images/Qcuj-lXOSWNDwF-FmSgCbQ==.jpg

这看起来很简单,但我不知道,谢谢你的帮助!


字符串可能在 html 文件中,可能是:

<td><img src="images/Qcuj/lXOSWNDwF/FmSgCbQ==.jpg" ></td>

如何正确匹配和替换?

谢谢大家!!一会儿我就明白答案了!

顺便说一下,我用的是php。

【问题讨论】:

  • 你有没有尝试过或做过一些研究?
  • 字符串在 HTML 文件中,所以它周围可能有很多标签,而不仅仅是匹配给定的字符串。
  • 如何提出好问题:stackoverflow.com/help/how-to-ask
  • 谢谢提醒,我会看帮助

标签: php regex preg-replace str-replace


【解决方案1】:

你可以使用:

$s = 'images/Qcuj/lXOSWNDwF/FmSgCbQ==.jpg';
echo preg_replace('~(images/)(*SKIP)(*F)|([^/]*)/~', '$1$2-', $s);
images/Qcuj-lXOSWNDwF-FmSgCbQ==.jpg

RegEx Demo

说明:

  • (*FAIL) 表现得像一个失败的否定断言,是 (?!) 的同义词
  • (*SKIP) 定义了一个点,当子模式稍后失败时,正则表达式引擎不允许回溯。
  • (*SKIP)(*FAIL) 一起提供了一个很好的限制替代方案,您不能在上面的正则表达式中进行可变长度的后视。
  • 在这个正则表达式中,我们匹配image/ 并且完全跳过+失败这个匹配。在其余输入中,我们匹配/ 并替换为-

更新:对于更新的正则表达式,您可以使用:

$s = '<td><img src="images/Qcuj/lXOSWNDwF/FmSgCbQ==.jpg" ></td>';
echo preg_replace('~(images/|</)(*SKIP)(*F)|([^/<"]*)/~', '$1$2-', $s);
<td><img src="images/Qcuj-lXOSWNDwF-FmSgCbQ==.jpg" ></td>

但是,我必须注意使用正则表达式修改 HTML 源代码。最好使用DOM 提取图像的src 部分,然后应用此正则表达式。

【讨论】:

  • 该字符串可能在html文件中,可能是:&lt;td&gt;&lt;img src="images/Qcuj/lXOSWNDwF/FmSgCbQ==.jpg" &gt;&lt;/td&gt;,如何正确匹配替换?
  • 使用正则表达式修改 HTML 很危险且容易出错。最好使用 DOM 提取 src 部分,然后应用此正则表达式。
  • 如果您没有选择使用 DOM,那么对于您的情况you can use this regex
  • 非常感谢!!正则表达式太难了,我还有很长的路要走
【解决方案2】:
list($path, $rest) = explode(PATH_SEPARATOR, $s, 2);
echo $path . PATH_SEPARATOR . implode('-', explode(PATH_SEPARATOR, $rest));
//⇒ images/Qcuj-lXOSWNDwF-FmSgCbQ==.jpg

在这里,我们将字符串拆分为 path其余部分,在 其余部分 中转换斜线并用斜线将片段粘合回来。是否可以避免使用正则表达式,请避免使用。

【讨论】:

  • 哦,我明白了,第一个版本不是 :)
【解决方案3】:

使用\G 锚点进行连续模式匹配。

锚 \G 匹配上一个匹配结束的位置。

(?:images/|(?<!^)\G)[^\n/]*\K/

使用上面的正则表达式,然后用-替换匹配的/

DEMO

$str = "images/Qcuj/lXOSWNDwF/FmSgCbQ==.jpg";
echo preg_replace('~(?:images/|(?<!^)\G)[^\n/]*\K/~', '-', $str);

输出:

images/Qcuj-lXOSWNDwF-FmSgCbQ==.jpg

【讨论】:

  • 字符串可能在html文件中,可能是:&lt;td&gt;&lt;img src="images/Qcuj/lXOSWNDwF/FmSgCbQ==.jpg" &gt;&lt;/td&gt;,这怎么匹配?​​
  • 非常感谢!这行得通! ^_^ 我没有足够的声望给你投票,对不起
【解决方案4】:

不要在捏鼻子的同时跳过箍以使其与正则表达式一起使用,只需先拆分字符串并仅在第二部分应用替换:

$s = 'images/Qcuj/lXOSWNDwF/FmSgCbQ==.jpg';
list($prefix, $suffix) = explode('/', $s, 2);

$t = $prefix . '/' . strtr($suffix, '/', '-');

【讨论】:

    猜你喜欢
    • 2018-02-27
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 2023-04-03
    • 2011-11-23
    相关资源
    最近更新 更多