2017-03-02 56 views
-1

所以我正在完成我的最后一段代码,并注意到PHP没有遵循正则表达式设置的规则。认为它在Javascript中工作得很好。我不确定我需要做什么才能使用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:

$regex = "/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=|\?v=)([^#\&\?]*).*/"; 

if(isset($ytVideo) && preg_match($regex,$ytVideo)) { 

我也只注意到这个正则表达式似乎并不在意是否有 “YouTube” 的网址内。我试过其他表达式,但似乎没有工作期望这一个...有些什么......

另外一个,我发现,我认为将是一个很好的表达了这样一条:

^((?:https?:)?\/\/)?((?:www|m)\.)?((?:youtube\.com|youtu.be))(\/(?:[\w\-]+\?v=|embed\/|v\/)?)([\w\-]+)(\S+)?$ 

但是,这一个似乎并不适用于Javascript/PHP。

+0

它的工作方式与JS相同。你有什么问题?分享JS和PHP代码。 –

+0

正如Wiktor所写,正则表达式在PHP和JS中(和我认为的大部分语言实际上都以相同的方式工作)。 – ElChupacabra

回答

-1

你可以做到这一点

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"; 
+0

我修正了它。用我的javascript我注意到,我有新的表达ytMatch [2] .length,并导致表达不能正常工作,PHP方面似乎工作得很好。非常感谢您的帮助。 –

0

简化:

$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个字符(这似乎是可预见的未来)。

0

在您的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正则表达式中使用~作为正则表达式分隔符,则不必在模式内转义/