我需要用其他网址前缀替换我的内容中的网址:
即如果当前网址为<a href="http://myoldurl.com">link</a>
,我想将其更改为:
<a href="http://myurl.com/create/?url=http://myoldurl.com">link</a>
如何使用preg_replace替换我的链接?
答案 0 :(得分:1)
使用(X)HTML时,最好使用专用的解析器。肯定有包含标记的文件会导致此正则表达式解决方案失败。放置在注释,CDATA部分,脚本,样式和/或属性值中的邪恶边缘案例字符串可以将其绊倒。 (虽然这些应该非常罕见。)
这里的许多人会告诉你永远不要使用HTML正则表达式。但是,这个问题涉及一个非常具体的目标字符串,精心设计的正则表达式解决方案可以很好地适用于手头的一次性任务。我将如何做到这一点:
$text = preg_replace('%
# Match A element open tag up through specific HREF value.
( # $1: Everything up to target HREF value.
<A # Literal start of A element open tag.
(?: # Zero or more attributes before HREF.
\s+ # Whitespace required before each attribute.
(?!HREF) # Assert this attribute is not HREF.
[\w\-.:]+ # Required attribute name.
(?: # Attribute value is optional.
\s*=\s* # Attrib value separated by =.
(?: # Group attrib value alternatives.
"[^"]*" # Either double quoted value,
| \'[^\']*\' # or single quoted value,
| [\w\-.:]+ # or unquoted value.
) # End attrib value alternatives.
)? # Attribute value is optional.
)* # Zero or more attributes before HREF.
\s+ # Whitespace required before HREF attribute.
HREF # HREF attribute name.
\s*=\s* # Value separated by =, optional whitespace.
) # End $1: Everything up to target HREF value.
([\'"]) # $2: HREF attrib value opening quote.
http://myoldurl\.com # Target URL to be replaced.
.*? # Any path/query/fragment on target URL.
\2 # HREF attrib value matching closing quote.
%xi',
'$1"http://myurl.com/create/?url=http://myoldurl.com"',
$text);
只有当HREF
链接标记的A
属性内部(包含单引号或双引号的值)时,才会替换目标网址。它还将删除可能附加到旧目标URL的任何路径/查询/片段。它允许在HREF
属性之前显示任意数量的其他标记属性。
答案 1 :(得分:0)
将http://myoldurl.com
中的$string
中的每个链接中的每个http://myurl.com/create/?url=http://myoldurl.com
替换为$string = preg_replace("/href=\"http:\/\/myoldurl\.com/i", "href=\"http://myurl.com/create/?myoldurl.com", $string);
:
{{1}}