用php获取<tag>和</ tag>之间的所有内容

Nat*_*ate 27 php regex

我正在尝试使用正则表达式在字符串中抓取一个字符串.

我看了看,但我似乎无法得到任何我必须工作的例子.

我需要抓取html标签<code>和</ code>以及它们之间的所有内容.

然后我需要从父字符串中提取匹配的字符串,对两者执行操作,

然后将匹配的字符串放回父字符串中.

这是我的代码:

$content = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. &lt;code>Donec sed erat vel diam ultricies commodo. Nunc venenatis tellus eu quam suscipit quis fermentum dolor vehicula.&lt;/code>"
$regex='';
$code = preg_match($regex, $text, $matches);
Run Code Online (Sandbox Code Playgroud)

我已经尝试过这些没有成功:

$regex = "/<code\s*(.*)\>(.*)<\/code>/";
$regex = "/<code>(.*)<\/code>/";
Run Code Online (Sandbox Code Playgroud)

pio*_*ouM 30

您可以使用以下内容:

$regex = '#<\s*?code\b[^>]*>(.*?)</code\b[^>]*>#s';
Run Code Online (Sandbox Code Playgroud)
  • \b确保<codeS>不捕获拼写错误(如).
  • 第一个模式[^>]*使用属性(例如类)捕获标记的内容.
  • 最后,标志s用换行符捕获内容.

请在此处查看结果:http://lumadis.be/regex/test_regex.php?id = 1081

  • 这是完全自然的,因为问题是捕获 `&lt;code&gt;...&lt;/code&gt;` 标签的内容,而不是捕获自闭合标签(与 `&lt;code&gt;` 标签无关)。 (5认同)

Joe*_*Joe 24

$regex = '#<code>(.*?)</code>#';
Run Code Online (Sandbox Code Playgroud)

使用#作为分隔符而不是/因为我们不需要转义/in</code>

正如Phoenix在下面发布的那样,.*?用来使.*("任何东西")匹配尽可能少的字符,然后才会遇到</code>(称为"非贪婪量词").那样,如果你的字符串是

<code>hello</code> something <code>again</code>
Run Code Online (Sandbox Code Playgroud)

你会匹配hello,again而不仅仅是匹配hello</code> something <code>again.

  • 如果字符串包含多个`<code>`标签(确认OP中的示例没有表明这一点),它应该是`(.*?)`吗? (6认同)

小智 22

这个功能对我有用

<?php

function everything_in_tags($string, $tagname)
{
    $pattern = "#<\s*?$tagname\b[^>]*>(.*?)</$tagname\b[^>]*>#s";
    preg_match($pattern, $string, $matches);
    return $matches[1];
}

?>
Run Code Online (Sandbox Code Playgroud)

  • 为了安全起见,您必须添加它作为回报:`return isset($ matches [1])吗?$ matches [1]:false;`如果标签不存在,则会给出错误信息。 (2认同)

Alb*_*tti 7

你也可以用/<code>([\s\S]*)<\/code>/msU 这个抓住NEWLINES!

  • 如果您需要一个非贪婪的选项,只需在*'/ <代码>后面加一个问号([\ s\S]*?)<\/code>/msU' (2认同)