Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >php --为什么这个正则表达式将我的字符串截断为零长度?

php --为什么这个正则表达式将我的字符串截断为零长度?
EN

Stack Overflow用户
提问于 2009-09-25 22:44:25
回答 4查看 221关注 0票数 1

昨天我发现了一个奇怪的错误,它导致一个网站只显示一个白色的页面--没有内容,也没有可见的错误信息。

我发现preg_replace中使用的正则表达式是问题所在。

我使用regex来替换在回显html之前积累的内容中的title html标记。在bug发生的页面上,html变得相当大(60 kb --不太大),而且看起来preg_replace / regex只能处理一定长度的字符串--或者我的regex真的搞砸了(也可能)。

请看这个示例程序,它再现了问题(在PHP 5.2.9上进行了测试):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function replaceTitleTagInHtmlSource($content, $replaceWith) {
  return preg_replace('#(<title>)([\s\S]+)(<\/title>)#i', '$1'.$replaceWith.'$3', $content);
}


$dummyStr = str_repeat('A', 6000);

$totalStr = '<title>foo</title>';

for($i = 0; $i < 10; $i++) {
  $totalStr .= $dummyStr;
}

print 'orignal: ' . strlen($totalStr);
print '<hr />';

$replaced = replaceTitleTagInHtmlSource($totalStr, 'bar');

print 'replaced: ' . strlen($replaced);
print '<hr />';

输出:

起源: 60018

替换: 0

因此-函数获得长度为60000的字符串,并返回长度为0的字符串。这不是我想要做的事。

改变

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for($i = 0; $i < 10; $i++) {

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for($i = 0; $i < 1; $i++) {

为了减少字符串的总长度,输出如下:

原始地址: 6018

取代: 6018

当我删除替换时,显示页面的内容时没有出现任何问题。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-09-25 23:01:19

你好像遇到了回溯极限

如果您打印preg_last_error():它返回PREG_BACKTRACK_LIMIT_ERROR,就会确认这一点。

您可以增加ini文件中的限制,也可以使用ini_set(),或者将正则表达式从([\s\S]+)更改为.*?,这将大大阻止它的回溯。

票数 3
EN

Stack Overflow用户

发布于 2009-09-25 23:07:57

以前曾多次这样说过,例如匹配第一个结束的HTMl标记的Regex (可能还会再次提到),正则表达式不适合于HTML,因为标签太不规则了。

在可用的地方使用DOM函数。

票数 1
EN

Stack Overflow用户

发布于 2009-09-25 23:37:19

回溯:[\s\S]+将匹配所有可用字符,然后向后遍历字符串,查找</title>[^<]+匹配所有不是<的字符,因此可以更快地抓取</title>

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function replaceTitleTagInHtmlSource($content, $replaceWith) {
  return preg_replace('#(<title>)([^<]+)(</title>)#i', '$1'.$replaceWith.'$3', $content);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1480594

复制
相关文章
你会吗? 为什么长度为零的切片sl, 可以是用 sl[0:5] 而不报错
在 golang 中, 所有传递都是值传递。 切片是引用类型, 所以在函数中可以修改底层数据。 结合第一条, 函数内的切片 和 函数外的切片不是同一个。 sl[0:5] 操作的是 **底层** 数据, 并返回了新一个切片。 package main import "fmt" func main() { sl := make([]int, 0, 10) appendFn := func(s []int) { // 值传递, s 并不是 sl。 // 但数组是引用
老麦
2022/12/24
3640
你会吗? 为什么长度为零的切片sl, 可以是用 sl[0:5] 而不报错
正则表达式匹配_正则表达式匹配字符串长度
请实现一个函数用来匹配包括’.’和’*’的正则表达式。模式中的字符’.’表示任意一个字符,而’*’表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”ab*ac*a”匹配,但是与”aa.a”和”ab*a”均不匹配
全栈程序员站长
2022/09/19
2K0
CA1825:避免数组分配长度为零
初始化长度为零的数组将导致不必要的内存分配。 请改为通过调用 Array.Empty 方法来使用静态分配的空数组实例。 内存分配在此方法的所有调用之间共享。
用户4268038
2022/02/19
4320
2021-06-30:给定长度为m的字符串aim,以及一个长度为n
2021-06-30:给定长度为m的字符串aim,以及一个长度为n的字符串str ,问能否在str中找到一个长度为m的连续子串, 使得这个子串刚好由aim的m个字符组成,顺序无所谓, 返回任意满足条件的一个子串的起始位置,未找到返回-1。
福大大架构师每日一题
2021/06/30
4090
2021-06-30:给定长度为m的字符串aim,以及一个长度为n
PHP内核之旅-4.可变长度的字符串
PHP 内核之旅系列 PHP内核之旅-1.生命周期 PHP内核之旅-2.SAPI中的Cli PHP内核之旅-3.变量 PHP内核之旅-4.字符串 一、字符串源码  zend_string 1 typedef struct _zend_string zend_string; //定义 zend_string变量 2 struct _zend_string { //_zend_string结构体 3 zend_refcounted_h gc; 4 zend_ulong h;
悟空聊架构
2018/05/18
1.2K0
PHP内核之旅-4.可变长度的字符串
一、字符串源码  zend_string 1 typedef struct _zend_string zend_string; //定义 zend_string变量 2 struct _zend_string { //_zend_string结构体 3 zend_refcounted_h gc; 4 zend_ulong h; /* hash value */ 5 size_t len; 6 char
悟空聊架构
2018/06/26
8750
2021-06-30:给定长度为m的字符串aim,以及一个长度为n的字符串str ,问能否在str中找到一个长度为m的连续子串,
2021-06-30:给定长度为m的字符串aim,以及一个长度为n的字符串str ,问能否在str中找到一个长度为m的连续子串, 使得这个子串刚好由aim的m个字符组成,顺序无所谓, 返回任意满足条件的一个子串的起始位置,未找到返回-1。
福大大架构师每日一题
2021/08/05
8710
sqlserver将截断字符串或二进制数据_达梦数据库字符串截断
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/185304.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/27
9210
java获取string字符串长度_java判断字符串长度
网络数据的基本单位总是字节,Java NIO 提供了ByteBuffer作为它的字节容器,但是其过于复杂且繁琐。
全栈程序员站长
2022/09/29
4.4K0
java获取string字符串长度_java判断字符串长度
C++常用的string字符串截断函数
C++中经常会用到标准库函数库(STL)的string字符串类,跟其他语言的字符串类相比有所缺陷。这里就分享下我经常用到的两个字符串截断函数:
charlee44
2019/08/13
2.9K0
PHP代码审计笔记
http://blog.evalbug.com/2015/11/10/different_arrays_compare_indentical_due_to_integer_key_truncation/
用户5878089
2019/07/23
1.2K0
2021-02-06:假设字符串str长度为N,请问最长回文子串的长度是多少?
3)理解 L…(i`)…C…(i)…R 的结构,以及根据i’回文长度进行的状况划分。
福大大架构师每日一题
2021/02/06
4760
2021-02-06:假设字符串str长度为N,请问最长回文子串的长度是多少?
php 字符串替换中文,PHP中文字符串替换其中为*的方法
在项目中需要对字符串的部分进行隐藏或者替换。譬如手机号码的中间几位进行隐藏,中文名字的中间替换为*号等。
全栈程序员站长
2022/08/25
7.9K0
LeetCode 2138. 将字符串拆分为若干长度为 k 的组
注意,在去除最后一个组的填充字符 fill(如果存在的话)并按顺序连接所有的组后,所得到的字符串应该是 s 。
Michael阿明
2022/03/10
9550
LeetCode 1876. 长度为三且各字符不同的子字符串
https://leetcode-cn.com/contest/biweekly-contest-53/problems/substrings-of-size-three-with-distinct-characters/
Michael阿明
2021/09/06
8320
对称字符串的最大长度
题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度。比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出4。 思路:可能很多人写过判断一个字符串是不是对称函数,这个题目可以看成是该函数的加强版。首先想到的就是遍历,暂且先不考虑效率问题。判断一个字符串是不是对称的函数,可以用这个字函数逐一检查原字符串中所有的子字符串,然后输出长度最大的即可。 怎样判断一个字符串是不是对称的字符串? -->可以用两个指针分别指向字符串的第一个字符和最后一个字符,判断是否相等,如果不
猿人谷
2018/01/17
3.3K0
Php 为不足指定位数的数字补零
函数 str_pad(string,length,pad_string,pad_type) //参数 描述 string //必需。规定要填充的字符串。 length //必需。规定新的字符串长度。如果该值小于字符串的原始长度,则不进行任何操作。 pad_string //可选。规定供填充使用的字符串。默认是空白。 pad_type //可选。规定填充字符串的哪边。 //可能的值: STR_PAD_BOTH – //填充字符串的两侧。如果不是偶数,则右
Tony He
2022/11/17
6910
PHP正则表达式和字符串匹配
正则表达式是一种可以用来匹配字符串的模式。在PHP中,可以使用preg_match()函数来使用正则表达式进行匹配。preg_match()函数接受两个参数,第一个参数是正则表达式,第二个参数是要匹配的字符串。它返回匹配成功的次数,如果匹配失败则返回0。
堕落飞鸟
2023/04/27
1.3K0
点击加载更多

相似问题

为什么我的字符串长度被打印为零?

24

为什么html集合的长度为零?

219

为什么/如何将我的变量设置为零

20

调试器摘要显示文本时,为什么这个NSString长度为零?

13

为什么这个ng最大长度将我的有效输入设置为未定义的输入?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文