PHP preg_replace用html替换通配符字符串以及通配符后会发生什么

时间:2018-05-24 20:54:53

标签: php regex

嘿,我很难理解正则表达式,但我认为最符合我需求的是这一行:

    $str = preg_replace('/https:\/\/clips.twitch.tv\/(.*?)/', '<iframe src="https://clips.twitch.tv/embed?autoplay=false&clip=$1&tt_content=embed&tt_medium=clips_embed" width="640" height="360" frameborder="0" scrolling="no" allowfullscreen="true"></iframe>', $text);

我想要的是替换f.ex这个链接:

https://clips.twitch.tv/GleamingHelpfulOxNotLikeThis

成为替换部分中的HTML,但最后一部分是f.ex. GleamingHelpfulOxNotLikeThis在iframe后面而不是clip=之后,我认为$1我认为可行。{/ 1>

1 个答案:

答案 0 :(得分:0)

.*?会匹配域名后的所有内容,因此您需要在匹配中包含整个行的其余部分。使用?使其变得非贪婪并没有帮助,因为在通配符之后没有任何内容会导致它停止。

如果网址的最后一部分只是一个字母数字字符串,请使用\w*代替.*

如果不是这些URL的构造方式,您需要找到一些其他方法来告知URL在文本中的结束位置。这不是微不足道的,往往需要行为不端的启发式方法。 URL可以使用大多数字符而不需要任何转义,包括大多数标点符号,但是当人们将它们键入自由流动的文本时,他们通常会在它们之后添加标点符号并打算将其区分开来。例如,某人可能写道:

Is the URL http://www.foo.com/foobarbaz?

他们打算?将其标记为问题,以便网址以foobarbaz结尾,但?是网址中的有效(和常见)字符,因此& #39;没有理由http://www.foo.com/foobarbaz?无法成为预期的网址。作为人类,我们通常没有问题从上下文中解决这个问题,但一个简单的正则表达式几乎没有希望。我已经看到许多自动URL识别器像这样陷入困境。

因此,您应该做好准备,无论您使用什么作为正则表达式,它都可能无法正确解析所有URL,除非对可以使用的URL有限制。