它找到了一个匹配项: 但它不会匹配这个: 知道为什么吗?感谢您的任何见解。 预计到达-6ren">
gpt4 book ai didi

php - preg_match_all : Why would "this" match but "that" won't?

转载 作者:搜寻专家 更新时间:2023-10-31 21:46:11 25 4
gpt4 key购买 nike

所以,我基本上是在尝试匹配对象标签内(包括)内的任何内容:

<?php preg_match_all('/<object(.*)<\/object>/', $blah, $blahBlah); ?>

它找到了一个匹配项:

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="250" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=9048799&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="400" height="250" src="http://vimeo.com/moogaloop.swf?clip_id=9048799&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object>

但它不会匹配这个:

<object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=5630744&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=5630744&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object>

知道为什么吗?感谢您的任何见解。


预计到达时间:由于我的方法一开始可能是错误的,这里有一些关于我正在尝试做的事情的背景。

这是一个 Wordpress 网站。我正在使用一个将短标签转换为完整视频嵌入代码的插件。该插件最近(谢天谢地)进行了更新,使代码更有效。

我尝试创建的功能只是在帖子中找到第一个视频对象,然后抓取它以在网站的其他地方使用。

这是整个函数(其中一些只有在使用过 Wordpress 后才有意义):

<?php
function catch_that_video() {
global $post, $posts;
$the_video = '';
ob_start();
ob_end_clean();
$output = preg_match_all('/<object(.*)<\/object>/', $post->post_content, $vid_matches);
$the_video = $vid_matches [1] [0];
if(empty($the_video)){ $the_video = 0; }
return $the_video;
}
?>

最佳答案

唯一想到的是单行与多行。

/<object(.*)<\/object>/m

这应该匹配多行。

本手册页讨论修饰符:

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

更新:

经过进一步调查,m不是正确的修饰符(来自手册):

m (PCRE_MULTILINE) By default, PCRE treats the subject string as consisting of a single "line" of characters (even if it actually contains several newlines). The "start of line" metacharacter (^) matches only at the start of the string, while the "end of line" metacharacter ($) matches only at the end of the string, or before a terminating newline (unless D modifier is set). This is the same as Perl. When this modifier is set, the "start of line" and "end of line" constructs match immediately following or immediately before any newline in the subject string, respectively, as well as at the very start and end. This is equivalent to Perl's /m modifier. If there are no "\n" characters in a subject string, or no occurrences of ^ or $ in a pattern, setting this modifier has no effect.

(强调我自己的。)

正确的修饰符应该是 s这将允许点元字符 .匹配换行符。

转到更新后的问题,如果这些输入是简单字符串,则正则表达式本身会匹配这两个输入。我不知道是什么导致了实际问题。

$input = '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="250" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=9048799&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="400" height="250" src="http://vimeo.com/moogaloop.swf?clip_id=9048799&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object>';

$input2 = '<object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=5630744&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=5630744&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object>';

$matches = array();
preg_match_all('/<object(.*)<\/object>/', $input, $matches);
echo '<br />$input<pre>';
var_dump($matches);
echo '</pre>';

$matches2 = array();
preg_match_all('/<object(.*)<\/object>/', $input2, $matches2);
echo '<br />$input2<pre>';
var_dump($matches2);
echo '</pre>';

继续:

你想用这两行来完成什么?

ob_start();
ob_end_clean();

这会打开一个新的输出缓冲区并立即将其终止。 (请参阅 documentation 中有关堆叠输出缓冲区的内容。)

是否有理由将其设置为 0,而不是说 null

if(empty($the_video)){ $the_video = 0; }

就我个人而言,我会将其设置为 null在声明它时,如果没有匹配项,就不要破坏它。这就是我编写该函数的方式,假设 $post是一个 WordPress 全局。 (就个人而言,我会把它传递给函数,因为我对大多数全局变量都不屑一顾。)

function catch_that_video() 
{
global $post;

$the_video = null;
$vid_matches = array();

if(preg_match('/<object.*<\/object>/', $post->post_content, $vid_matches))
{
$the_video = $vid_matches[0];
}

return $the_video;
}

我将其更改为使用 preg_match而不是 preg_match_all ,因为您只使用了第一个匹配项。当然,这可以修改为使用 preg_match_all , 如有必要。但是,创建适当的正则表达式会很痛苦。 (在上面的正则表达式中添加 s 修饰符以处理多行会获取从第一个开始 <object> 标签到最后一个结束 </object> 标签的所有内容。我什至不想考虑尝试来使用正则表达式覆盖多行并获取单个 <object>...</object> block 。)

但是,这并没有回答关于为什么第二个对象 block 没有被匹配的原始问题。我会将我的调查重点放在试图发现两个字符串之间的区别上。如果问题是行尾之间的差异,我会在 Linux 上使用类似 VIM 的东西,因为它会显示 `^M' 代替行尾中的\r。字符串的html编码怎么样?这可能是个问题吗?

关于php - preg_match_all : Why would "this" match but "that" won't?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3269945/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com