如何将正则表达式从Javascript转换为使用PHP?

如何将正则表达式从Javascript转换为使用PHP?,javascript,php,regex,expression,Javascript,Php,Regex,Expression,所以我在完成最后一段代码时注意到PHP没有遵循正则表达式设置的规则。我认为它可以与Javascript配合使用。我不确定我需要做什么才能让它与PHP一起工作 /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=|\?v=)([^#\&\?]*).*/ 这是YouTube验证 任何提示都将受到欢迎 编辑: Javascript: var regExp = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|wat

所以我在完成最后一段代码时注意到PHP没有遵循正则表达式设置的规则。我认为它可以与Javascript配合使用。我不确定我需要做什么才能让它与PHP一起工作

/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=|\?v=)([^#\&\?]*).*/
这是YouTube验证

任何提示都将受到欢迎

编辑:

Javascript:

var regExp = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=|\?v=)([^#\&\?]*).*/;
var ytMatch = ytVideo.value.match(regExp);

  if(ytMatch && ytMatch[2].length == 11) {
PHP:

我还注意到,这个正则表达式似乎并不关心URL中是否有“youtube”。我试过其他的表达方式,但除了这个,似乎没有一个有效。。。一些什么

我发现另一个我认为是很好的表达方式是:

^((?:https?:)?\/\/)?((?:www|m)\.)?((?:youtube\.com|youtu.be))(\/(?:[\w\-]+\?v=|embed\/|v\/)?)([\w\-]+)(\S+)?$
但是再一次,这一个似乎在Javascript/PHP上也不起作用。

你可以这样做

 preg_match_all("|<[^>]+>(.*)</[^>]+>|U",
"<b>example: </b><div align=left>this is a test</div>",
$out, PREG_PATTERN_ORDER);
echo $out[0][0] . ", " . $out[0][1] . "\n";
echo $out[1][0] . ", " . $out[1][1] . "\n";
preg_match_all(“|]+>(.*)]+>|U”,
“示例:这是一个测试”,
$out,预模式(订单);
echo$out[0][0]。", " . $输出[0][1]。“\n”;
echo$out[1][0]。", " . $出[1][1]。“\n”;
简化:

$pattern = "#(http(?:s)?://youtu\.be(/embed)?/[A-Za-z0-9_-]{11})|http(?:s)?://(?:www\.)?youtube\.com/watch\?v=[A-Za-z0-9_-]{11}#";

if(isset($ytVideo) && preg_match($pattern,$ytVideo)) { ...
这将匹配包含以下内容的字符串(在其中的任何位置):

http://youtu.be/abcdefghijk 
http://youtu.be/embed/abcdefghijk 
http://youtube.com/watch?v=abcdefghijk 
http://www.youtube.com/watch?v=abcdefghijk 
以及他们所有的
https
副本


这假设YouTube内容ID的长度为11个字符(在可预见的未来似乎是这样)

在JS代码中,检查组2的长度是否等于
11

if(ytMatch && ytMatch[2].length == 11) {
              ^^^^^^^^^^^^^^^^^^^^^^^
在PHP中,仅检查是否存在匹配项:

if(isset($ytVideo) && preg_match($regex,$ytVideo)) { 
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
我建议使用
preg_match
检查是否存在匹配,并将匹配数据放入变量中,然后在
if
块内检查第二组长度:

$regex  = "~^.*(youtu\.be/|v/|u/\w/|embed/|watch\?v=|&v=|\?v=)([^#&?]*).*~";
if(isset($ytVideo) && preg_match($regex,$ytVideo, $match)) { 
    if (strlen($match[2]) == 11) {
         // Yes, Group 2 length is 11, do something
    }
}

注意,您需要在模式中转义一个
,如果您在PHP正则表达式中使用
~
作为正则表达式分隔符,则不必在模式中转义
/

它的工作方式与JS中相同。你有什么问题?分享JS和PHP代码。正如Wiktor所写的,regex在PHP和JS中的工作方式相同(实际上我认为在大多数语言中也是如此)。我修复了它。使用javascript时,我注意到我的ytMatch[2].length与新表达式匹配,这导致表达式无法正常工作,PHP端似乎可以很好地使用它。谢谢你的帮助。
$regex  = "~^.*(youtu\.be/|v/|u/\w/|embed/|watch\?v=|&v=|\?v=)([^#&?]*).*~";
if(isset($ytVideo) && preg_match($regex,$ytVideo, $match)) { 
    if (strlen($match[2]) == 11) {
         // Yes, Group 2 length is 11, do something
    }
}