2016-01-21 51 views
0

我想从我正在提取的YouTube页面的源代码中挑选出一个值(在本例中,值为544007664)。目前,我拥有的脚本正在成功加载YouTube页面中的源代码,并删除了“<”和“>”符号,以便在回显源代码时显示为文本并且不显示页面本身。两个preg_replace()函数(这里是第4行和第5行)提取所需值前后的所有内容都没有达到我期望的效果。使用preg_replace()隔离源代码中的数字

我能想到的唯一的事情就是preg_replace()拒绝作为单个字符串文本阅读,而实际上是几十个单独的文本行。

<?php 
$str = file_get_contents('https://www.youtube.com/watch?v=5XR7naZ_zZA'); 
$str = $str; 
$str = preg_replace('~^(.)+(meta name="twitter:app:id:ipad" content=")~', '', $str); 
$str = preg_replace('~(" meta name="twitter:app:url:iphone")+(.)$~', '', $str); 
$str = preg_replace('~<~', '', $str); 
$str = preg_replace('~>~', '', $str); 
echo $str; 
?> 

任何帮助,非常感谢。

+0

您可能想要使用'preg_match'。尝试模式[像这样](https://regex101.com/r/qI2nO3/2):'$ pattern ='/ ] +?twitter:app:id:iphone)[^>] +?\ bcontent \ s * = \ s *“([^”] +)“/ i';'结果'$ out [1]'包含你的第一个加括号的组的匹配,对'twitter:app:url:iphone'做同样的处理。 [见eval.in演示](https:// eval。in/505852)或者使用'preg_match_all'与单个正则表达式[如本示例](https://eval.in/505856)。 –

回答

0

我认为你在这一个正确的轨道上,但正在推翻一点点。

这里有一个简单的代码片段,您可以用得到的数字:

$str = file_get_contents('https://www.youtube.com/watch?v=5XR7naZ_zZA'); 

$app_store_id = preg_replace('~.*?<meta property="al:ios:app_store_id" content="(\d+)">.*~si', '$1', $str); 

print $app_store_id; 

此输出:

544007664 

这里是正则表达式的解释:

  • .*? - 匹配任何字符.,任意次数*,直到它击中s是正则表达式字符串?的下一部分。下一部分是我们正在寻找的特定<meta ...标签。
  • <meta property="al:ios:app_store_id" content=" - 这只是找到其中包含“app_store_id”的元标记。
  • (\d+) - 这是抓取至少一个+数字\d。我们把它放在括号中,因为它会被分配到$1。我们将使用$1的值来替换字符串的内容。 (所以我们只用我们找到的号码替换整个网页。)
  • "> - 完成元标记。
  • .* - 匹配任何字符.,任意次数*之后的meta标记。

请注意,我用的是s标志我的表情后,使换行算作一个字符。这将有效地让你跨多行搜索。通常,s标志与m标志配对,虽然在这种情况下它不是必需的。

这里是一个页面的链接,列出了您可以在PHP中使用的不同标志。

http://php.net/manual/en/reference.pcre.pattern.modifiers.php

+0

再次感谢@Quixrick。你是男人。 – bethbee