Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.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 使用正则表达式匹配html标记中的特定内容_Php_Regex - Fatal编程技术网

Php 使用正则表达式匹配html标记中的特定内容

Php 使用正则表达式匹配html标记中的特定内容,php,regex,Php,Regex,我想匹配'script'标记,如果它内部包含'bb',它可以是'bb'和'script'标记之间的任何东西,包括换行符,所以我使用[\s\s]* 以下是我正在处理的文本: <script> aa </script> <script> bb </script> <script> cc </script> aa bb 复写的副本 模式是:[\s\s]*?bb[\s\s]*? 但是这也将'script'标记与'aa'内

我想匹配'script'标记,如果它内部包含
'bb'
,它可以是
'bb'
'script'
标记之间的任何东西,包括换行符,所以我使用
[\s\s]*

以下是我正在处理的文本:

<script>
 aa
</script>
<script>
 bb
</script>
<script>
 cc
</script>

aa
bb
复写的副本
模式是:
[\s\s]*?bb[\s\s]*?

但是这也将
'script'
标记与
'aa'
内部匹配,我尝试了很多次但都没有成功,那么如何将脚本标记与
'bb'
内部匹配?

只需使用
\s+bb\s+

说明:

-按字面意思匹配

\s+bb\s+
-将一个或多个空格与
\s+
匹配,将
bb
逐字匹配,再次将一个或多个空格与
\s匹配+`

-按字面意思匹配

您可以使用
[\s\s]
,它匹配每个字符:
\s
-匹配任何空白,
\s
-匹配除空白以外的所有字符。这就是您的模式不起作用的原因。

只需使用
\s+bb\s+

说明:

-按字面意思匹配

\s+bb\s+
-将一个或多个空格与
\s+
匹配,将
bb
逐字匹配,再次将一个或多个空格与
\s匹配+`

-按字面意思匹配


您可以使用
[\s\s]
,它匹配每个字符:
\s
-匹配任何空白,
\s
-匹配除空白以外的所有字符。这就是您的模式不起作用的原因。

使用正则表达式解析HTML不是一个好主意,因为在嵌套脚本标记时,它可能会给您带来意外的结果

但为了防止标记没有嵌套,您可以使用这个正则表达式,它将只匹配包含
bb
的脚本标记,并且不会像现在这样跨越多个脚本标记。在您的正则表达式中,
[\s\s]*?
匹配任何字符,因为它也匹配从第一个
标记开始的顺序
标记,该标记跨越多个
标记以覆盖
bb

<script>(?:(?!<script>)[\s\S])*?bb(?:(?!<script>)[\s\S])*?<\/script>
(?:(?!)[\s\s])*?bb(?:(?!)[\s\s])*?
此正则表达式与您的正则表达式几乎相同,唯一不同的是,我将
[\s\s]*?
部分更改为
(?:(?!)[\s\s])*?
此正则表达式不允许在单个匹配中捕获多个
标记,因此一次只匹配一个脚本标记

让我知道这是否适合你


使用正则表达式解析HTML不是一个好主意,因为当脚本标记嵌套时,它可能会给您带来意外的结果

但为了防止标记没有嵌套,您可以使用这个正则表达式,它将只匹配包含
bb
的脚本标记,并且不会像现在这样跨越多个脚本标记。在您的正则表达式中,
[\s\s]*?
匹配任何字符,因为它也匹配从第一个
标记开始的顺序
标记,该标记跨越多个
标记以覆盖
bb

<script>(?:(?!<script>)[\s\S])*?bb(?:(?!<script>)[\s\S])*?<\/script>
(?:(?!)[\s\s])*?bb(?:(?!)[\s\s])*?
此正则表达式与您的正则表达式几乎相同,唯一不同的是,我将
[\s\s]*?
部分更改为
(?:(?!)[\s\s])*?
此正则表达式不允许在单个匹配中捕获多个
标记,因此一次只匹配一个脚本标记

让我知道这是否适合你


模式:
/]*>(.*)/gi
然后检查contents@Seblor没错,尽管正则表达式仍然可以用于简单的文本,比如一个操作provided@GrafiCodeStudio它与任何内容都不匹配。模式:
/]*>(.*)/gi
,然后检查contents@Seblor的确,尽管正则表达式仍然可以用于简单的文本,比如provided@GrafiCodeStudio它与任何内容都不匹配。我的模式工作一半正确,它与第一个“script”标记匹配,这是错误的,但以正确的script标记结束,我希望匹配从第二个“script”标记开始。我使用\s\s是因为它可以是多个字符(包括空格)。我的模式工作对半,它与第一个“script”标记匹配,这是错误的,但以正确的script标记结束。我希望匹配从第二个“script”标记开始。我使用\s\s是因为它可以使用多个字符(包括空格)!这是使用前瞻,我将需要尝试,这是工作现在@露露:很高兴知道这对你很有效。也请考虑接受答案,这将给你+2代表,并可能有助于其他人在回答一个类似的问题。它的工作!这是使用前瞻,我将需要尝试,这是工作现在@露露:很高兴知道这对你很有效。另外,请考虑接受答案,这将给你+2代表,并可能有助于其他人在回答一个类似的问题。