2017-03-02 58 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正則表達式中使用~作爲正則表達式分隔符,則不必在模式內轉義/