PHP 用 URL 替换字符串中的模式
PHP replace patterns in string with URLs
我有几百个 html 文件想在网站上显示。
它们都有以下格式的链接:
[My Test URL|https://www.mywebsite.com/test?param=123]
问题是某些网址被拆分为:
[My Test URL|https://www.mywebsite.c om/test?param=123]
我想用 HTML 对应部分替换所有这些:
<a href="https://www.mywebsite.com/test?param=123">My Test URL</a>
我知道使用正则表达式“/[(.*?)]/”我可以匹配方括号,但是我如何通过管道拆分,删除 URL 中的空格并将所有内容转换为字符串?
如果要从 php
中的字符串中删除所有 WHITESPACES
,您需要做的就是:
$string = str_replace(' ', '', $string);
其中 $string
是带有 url
的字符串。
我想这会为你做的
$html = "[My Test URL|https://www.mywebsite.c om/test?param=123] [My Test URL|https://www.mywebsite.com/test?param=123]";
$html = preg_replace_callback("|\[.*?\|.*?\]|", function($matches){
list($anchor, $link) = explode("|",substr($matches[0], 1, -1));
return "<a href='".str_replace(' ', '', $link)."'>$anchor</a>";
}, $html);
echo $html;
// echos <a href="https://www.mywebsite.com/test?param=123">My Test URL</a> <a href="https://www.mywebsite.com/test?param=123">My Test URL</a>
如果您只想删除这些降价链接中 URL 部分的(空白)空格,您可以仅使用 preg_replace
之类的
preg_replace('~(?:\G(?!\A)|\[[^][|]*\|)[^][\s]*\K\s+(?=[^][]*])~', '', $text)
见regex demo。 详情:
(?:\G(?!\A)|\[[^][|]*\|)
- 上一场比赛结束或 [
,然后是 [
、]
和 |
以外的零个或多个字符,然后是|
字符
[^][\s]*
- 除 [
、]
和空格 以外的零个或多个字符
\K
- 丢弃目前匹配的所有文本
\s+
- 一个或多个空格
(?=[^][]*])
- 除了 [
和 ]
之外必须有零个或多个字符,然后 ]
紧邻当前位置的右侧。
如果要去掉URL部分的空格,将markdown转为HTML,最好使用preg_replace_callback
:
$text = '[My Test URL|https://ww w.mywebsite.c om/t est?param=123]';
echo preg_replace_callback('/\[([^][|]*)\|([^][]+)]/', function($m) {
return '<a href="' . str_replace(' ', '', $m[2]) . '">' . $m[1] . '</a>';
}, $text);
参见PHP demo。 详情:
\[
- 一个 [
字符
([^][|]*)
- 第 1 组:除 [
、]
和 |
之外的任何零个或多个字符
\|
- 一个 |
字符
([^][]+)
- 第 2 组:除 ]
和 [
之外的任何一个或多个字符
]
- 一个 ]
字符。
我有几百个 html 文件想在网站上显示。 它们都有以下格式的链接:
[My Test URL|https://www.mywebsite.com/test?param=123]
问题是某些网址被拆分为:
[My Test URL|https://www.mywebsite.c om/test?param=123]
我想用 HTML 对应部分替换所有这些:
<a href="https://www.mywebsite.com/test?param=123">My Test URL</a>
我知道使用正则表达式“/[(.*?)]/”我可以匹配方括号,但是我如何通过管道拆分,删除 URL 中的空格并将所有内容转换为字符串?
如果要从 php
中的字符串中删除所有 WHITESPACES
,您需要做的就是:
$string = str_replace(' ', '', $string);
其中 $string
是带有 url
的字符串。
我想这会为你做的
$html = "[My Test URL|https://www.mywebsite.c om/test?param=123] [My Test URL|https://www.mywebsite.com/test?param=123]";
$html = preg_replace_callback("|\[.*?\|.*?\]|", function($matches){
list($anchor, $link) = explode("|",substr($matches[0], 1, -1));
return "<a href='".str_replace(' ', '', $link)."'>$anchor</a>";
}, $html);
echo $html;
// echos <a href="https://www.mywebsite.com/test?param=123">My Test URL</a> <a href="https://www.mywebsite.com/test?param=123">My Test URL</a>
如果您只想删除这些降价链接中 URL 部分的(空白)空格,您可以仅使用 preg_replace
之类的
preg_replace('~(?:\G(?!\A)|\[[^][|]*\|)[^][\s]*\K\s+(?=[^][]*])~', '', $text)
见regex demo。 详情:
(?:\G(?!\A)|\[[^][|]*\|)
- 上一场比赛结束或[
,然后是[
、]
和|
以外的零个或多个字符,然后是|
字符[^][\s]*
- 除[
、]
和空格 以外的零个或多个字符
\K
- 丢弃目前匹配的所有文本\s+
- 一个或多个空格(?=[^][]*])
- 除了[
和]
之外必须有零个或多个字符,然后]
紧邻当前位置的右侧。
如果要去掉URL部分的空格,将markdown转为HTML,最好使用preg_replace_callback
:
$text = '[My Test URL|https://ww w.mywebsite.c om/t est?param=123]';
echo preg_replace_callback('/\[([^][|]*)\|([^][]+)]/', function($m) {
return '<a href="' . str_replace(' ', '', $m[2]) . '">' . $m[1] . '</a>';
}, $text);
参见PHP demo。 详情:
\[
- 一个[
字符([^][|]*)
- 第 1 组:除[
、]
和|
之外的任何零个或多个字符
\|
- 一个|
字符([^][]+)
- 第 2 组:除]
和[
之外的任何一个或多个字符
]
- 一个]
字符。