如何替换此字符串中的斜杠?
How can I replace the slash in this string?
我有一个像这样的字符串:
images/Qcuj/lXOSWNDwF/FmSgCbQ==.jpg
我想在 images/
之后将 /
替换为 -
结果可能是这样的:
images/Qcuj-lXOSWNDwF-FmSgCbQ==.jpg
这看起来很简单,但我没有头绪,谢谢帮助!
字符串可能在html文件中,可能像:
<td><img src="images/Qcuj/lXOSWNDwF/FmSgCbQ==.jpg" ></td>
这个如何正确匹配替换?
谢谢大家!!我会暂时理解答案!
顺便说一下,我使用 php。
您可以使用:
$s = 'images/Qcuj/lXOSWNDwF/FmSgCbQ==.jpg';
echo preg_replace('~(images/)(*SKIP)(*F)|([^/]*)/~', '-', $s);
images/Qcuj-lXOSWNDwF-FmSgCbQ==.jpg
解释:
(*FAIL)
表现得像一个失败的否定断言,是 (?!)
的同义词
(*SKIP)
定义了一个点,当子模式稍后失败时,正则表达式引擎不允许回溯超过该点
(*SKIP)(*FAIL)
一起提供了一个很好的限制替代方案,你不能在上面的正则表达式中有可变长度的后视。
- 在这个正则表达式中,我们匹配
image/
并跳过+完全失败这个匹配。在输入的其余部分,我们匹配 /
并替换为 -
。
更新: 对于更新的正则表达式,您可以使用:
$s = '<td><img src="images/Qcuj/lXOSWNDwF/FmSgCbQ==.jpg" ></td>';
echo preg_replace('~(images/|</)(*SKIP)(*F)|([^/<"]*)/~', '-', $s);
<td><img src="images/Qcuj-lXOSWNDwF-FmSgCbQ==.jpg" ></td>
但是我必须警告使用正则表达式修改 HTML 源代码。最好使用 DOM
提取图像的 src
部分,然后应用此正则表达式。
list($path, $rest) = explode(PATH_SEPARATOR, $s, 2);
echo $path . PATH_SEPARATOR . implode('-', explode(PATH_SEPARATOR, $rest));
//⇒ images/Qcuj-lXOSWNDwF-FmSgCbQ==.jpg
这里我们将字符串拆分为路径和其余,将其余[=16=中的斜杠进行转换] 并用斜线将碎片粘回去。能不能避免使用正则表达式,就避免吧。
使用\G
锚点进行连续模式匹配。
锚点\G匹配到上一个匹配结束的位置。
(?:images/|(?<!^)\G)[^\n/]*\K/
使用上面的正则表达式,然后将匹配的 /
替换为 -
$str = "images/Qcuj/lXOSWNDwF/FmSgCbQ==.jpg";
echo preg_replace('~(?:images/|(?<!^)\G)[^\n/]*\K/~', '-', $str);
输出:
images/Qcuj-lXOSWNDwF-FmSgCbQ==.jpg
不要一边捏着鼻子一边跳来跳去使其与正则表达式一起工作,只需先拆分字符串并仅在第二部分应用替换:
$s = 'images/Qcuj/lXOSWNDwF/FmSgCbQ==.jpg';
list($prefix, $suffix) = explode('/', $s, 2);
$t = $prefix . '/' . strtr($suffix, '/', '-');
我有一个像这样的字符串:
images/Qcuj/lXOSWNDwF/FmSgCbQ==.jpg
我想在 images/
/
替换为 -
结果可能是这样的:
images/Qcuj-lXOSWNDwF-FmSgCbQ==.jpg
这看起来很简单,但我没有头绪,谢谢帮助!
字符串可能在html文件中,可能像:
<td><img src="images/Qcuj/lXOSWNDwF/FmSgCbQ==.jpg" ></td>
这个如何正确匹配替换?
谢谢大家!!我会暂时理解答案!
顺便说一下,我使用 php。
您可以使用:
$s = 'images/Qcuj/lXOSWNDwF/FmSgCbQ==.jpg';
echo preg_replace('~(images/)(*SKIP)(*F)|([^/]*)/~', '-', $s);
images/Qcuj-lXOSWNDwF-FmSgCbQ==.jpg
解释:
(*FAIL)
表现得像一个失败的否定断言,是(?!)
的同义词
(*SKIP)
定义了一个点,当子模式稍后失败时,正则表达式引擎不允许回溯超过该点(*SKIP)(*FAIL)
一起提供了一个很好的限制替代方案,你不能在上面的正则表达式中有可变长度的后视。- 在这个正则表达式中,我们匹配
image/
并跳过+完全失败这个匹配。在输入的其余部分,我们匹配/
并替换为-
。
更新: 对于更新的正则表达式,您可以使用:
$s = '<td><img src="images/Qcuj/lXOSWNDwF/FmSgCbQ==.jpg" ></td>';
echo preg_replace('~(images/|</)(*SKIP)(*F)|([^/<"]*)/~', '-', $s);
<td><img src="images/Qcuj-lXOSWNDwF-FmSgCbQ==.jpg" ></td>
但是我必须警告使用正则表达式修改 HTML 源代码。最好使用 DOM
提取图像的 src
部分,然后应用此正则表达式。
list($path, $rest) = explode(PATH_SEPARATOR, $s, 2);
echo $path . PATH_SEPARATOR . implode('-', explode(PATH_SEPARATOR, $rest));
//⇒ images/Qcuj-lXOSWNDwF-FmSgCbQ==.jpg
这里我们将字符串拆分为路径和其余,将其余[=16=中的斜杠进行转换] 并用斜线将碎片粘回去。能不能避免使用正则表达式,就避免吧。
使用\G
锚点进行连续模式匹配。
锚点\G匹配到上一个匹配结束的位置。
(?:images/|(?<!^)\G)[^\n/]*\K/
使用上面的正则表达式,然后将匹配的 /
替换为 -
$str = "images/Qcuj/lXOSWNDwF/FmSgCbQ==.jpg";
echo preg_replace('~(?:images/|(?<!^)\G)[^\n/]*\K/~', '-', $str);
输出:
images/Qcuj-lXOSWNDwF-FmSgCbQ==.jpg
不要一边捏着鼻子一边跳来跳去使其与正则表达式一起工作,只需先拆分字符串并仅在第二部分应用替换:
$s = 'images/Qcuj/lXOSWNDwF/FmSgCbQ==.jpg';
list($prefix, $suffix) = explode('/', $s, 2);
$t = $prefix . '/' . strtr($suffix, '/', '-');