Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在<;标签>;及</标签>;使用php_Php_Regex - Fatal编程技术网

在<;标签>;及</标签>;使用php

在<;标签>;及</标签>;使用php,php,regex,Php,Regex,我正在尝试使用正则表达式获取字符串中的字符串 我看了又看,但我似乎找不到任何我必须工作的例子 我需要抓取html标记和以及它们之间的所有内容 然后我需要从父字符串中提取匹配的字符串,对这两个字符串执行操作 然后将匹配的字符串放回父字符串中 这是我的密码: $content = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. &lt;code>Donec sed erat vel diam ultricies com

我正在尝试使用正则表达式获取字符串中的字符串

我看了又看,但我似乎找不到任何我必须工作的例子

我需要抓取html标记
以及它们之间的所有内容

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

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

这是我的密码:

$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);
我已经尝试过这些,但没有成功:

$regex = "/<code\s*(.*)\>(.*)<\/code>/";
$regex = "/<code>(.*)<\/code>/";
$regex=“/(.*)/”;
$regex=“/
(.*)/”;
使用
#
作为分隔符而不是
/
,因为这样我们就不需要在
中转义
/

正如Phoenix在下面发布的那样,
*?
用于使
*
(“任何东西”)在遇到
(称为“非贪婪量词”)之前匹配尽可能少的字符。这样,如果你的字符串是

<code>hello</code> something <code>again</code>
你可以使用
/
([\s\s]*)/msU

这也赶上了新线

您可以使用以下选项:

$regex='#]*>(.*)]*>#s';
  • \b
    确保不会捕获打字错误(如
  • 第一个模式
    [^>]*
    捕获带有属性的标记的内容(例如类)
  • 最后,标志
    s
    用换行符捕获内容

在这里查看结果:

此函数对我有效

<?php

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

?>

您也可以尝试:

function getTagValue($string, $tag)
{
    $pattern = "/<{$tag}>(.*?)<\/{$tag}>/s";
    preg_match($pattern, $string, $matches);
    return isset($matches[1]) ? $matches[1] : '';
}
函数getTagValue($string,$tag) { $pattern=“/(*?)/s”; 预匹配($pattern,$string,$matches); 返回isset($matches[1])?$matches[1]:“”; }

如果不匹配,它将返回空字符串。

检索或删除脚本标记的内容,即使是像
这样的特殊情况

$str='1〕
一些js嵌入
警报(“js”)
let job,origin=new Date().getTime()
重置
计时器实验
';


$reg='/小马托尼,他来了。。。实际上,这与解析单个BBcode标记没有什么不同。它没有属性,只是一个直接的
(.*)
@minitech来解析一个BBcode标签?对于正则表达式来说,这听起来是一个完美的情况,让Pear参与这么简单的事情毫无意义。我只是随便猜测一下,但考虑到他提出的问题,我认为你不必担心
[NOPARSE]
或任何愚蠢的事情:只是“如何匹配这个字符串文字和那个字符串文字之间的任何内容”,其中字符串文本恰好是XML标记。字符串文字不可能有额外的变化,因此没有必要使其复杂化。为什么您只在30分钟前发布了完全相同的问题?如果字符串包含多个
标记(确认OP中的示例没有指出这一点),应该是
(.*)
)我喜欢贪婪的选择我知道这太老了。。。但是要非常小心上面的正则表达式。我以前在非常大的XML文档上使用过这种类型的正则表达式。关闭贪婪设置,否则会导致灾难性的回溯。@Joe为什么它不适用于
@github、@gcal-work、
(请注意末尾的逗号)?…它只拾取第一个标记…即@github。有什么想法吗?@KhurshidAlam您可能需要添加
g
标志,以使正则表达式成为“全局的”——即,使其返回所有匹配项,而不仅仅是第一个匹配项。只需在结尾分隔符后添加一个小写字母
g
,例如
#(.*?)#g
如果你需要一个非贪婪选项,只需在*'/
([\s\s]*?)/msU后面加一个问号即可。我想你喜欢贪婪选项,也不要吹嘘非贪婪:PIt对没有结尾标记的标记不起作用。例如,它对
不起作用。这是完全自然的,因为问题是捕获
..
标记的内容,而不是捕获自动关闭标记(与
标记无关)。而不是在标记之间选择整个文本,如何只选择选定的字符?这段庞大的代码应该包含一些解释。您能解释一下为什么返回$matches[1]而不是[0]?$matches[0]是您传递的代码的外层。要获取innerHtml,您应该获得$matches[1],您必须添加此项以换取更安全的方式:
return isset($matches[1])$匹配[1]:假如果标签不存在,那么它将给出错误。这是完美的,应该是公认的答案,谢谢!标签可以工作,但不能与p标签一起工作。这并不能回答OP的具体问题。这个答案属于另一个问题。此外,在查询html文档时,应该使用DOM解析器,而不是正则表达式。
<?php

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

?>
function getTagValue($string, $tag)
{
    $pattern = "/<{$tag}>(.*?)<\/{$tag}>/s";
    preg_match($pattern, $string, $matches);
    return isset($matches[1]) ? $matches[1] : '';
}
$str = '
Some js embed
<script async>
  alert("js")
  let job, origin = new Date().getTime()
</script>
<span id="OUT"></span>
<button onclick="alert()">RESET</button>
timer experiment
';

$reg = '/<script([\s\S]*)<\/script>/';

preg_match($reg, $str, $matches);
$match = substr($matches[0], (strpos($matches[0], ">")+1));
$match = str_replace("</script>", "", $match);
echo $match;
/* OUTPUT
  alert("js")
  let job, origin = new Date().getTime()
*/
echo "\n---------------------\n";
echo preg_replace($reg, "DELETED", $str);
/* OUTPUT
  Some js embed
  DELETED
  <span id="OUT"></span>
  <button onclick="alert()">RESET</button>
  timer experiment
*/