- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我需要测试是否有任何字符串 'hello'、'i am'、'dumb' 存在于称为 $ohreally 的较长字符串中,如果其中一个存在,我的测试就结束了,我有知道如果其中一个发生,其他两个都不会发生。
在这种情况下,我请求您帮助以最有效的方式编写此搜索,
strpos() 像这样 3 次?
if (strpos ($ohreally, 'hello')){return false;}
else if (strpos ($ohreally, 'i am')){return false;}
else if (strpos ($ohreally, 'dumb')){return false;}
else {return true;}
还是一个 preg_match?
if (preg_match('hello'||'i am'||'dumb', $ohreally)) {return false}
else {return true};
我知道 preg_match 代码是错误的,如果有人能提供它的正确版本,我将不胜感激。
谢谢!
回答
请阅读 cletus 所说的内容和下面的测试 middaparka 所做的。我还对各种长弦和短弦进行了微时测试。有了这些结果
如果,您知道字符串值出现的概率,请按从大到小的顺序排列它们。 (我没有注意到正则表达式本身的排序有明显的不同,即在 /hello|i am|dumb/
或 /i am|dumb|hello/
之间。
另一方面,在顺序 strpos 中,概率会造成所有差异。例如,如果出现“你好”的概率为 90%,出现“我是”的概率为 7%,出现“笨蛋”的概率为 3%。你想组织你的代码首先检查'hello'并尽快退出该功能。
我的 microtime 测试显示了这一点。
分别在第一次、第二次、第三次执行strpos()时找到针的大海捞针A、B、C,时间如下,
正位:
A: 0.00450 秒//1 strpos()
B: 0.00911 秒//2 strpos()
C: 0.00833 秒//3 strpos()
C: 0.01180 秒//4 strpos() 额外加了一个
对于preg_match:
A: 0.01919 秒//1 preg_match()
B: 0.02252 秒//1 preg_match()
C: 0.01060 秒//1 preg_match()
如数字所示,在第 4 次执行之前 strpos 速度更快,所以我将改用它,因为我只有 3 个子 stings 要检查:)
最佳答案
正确的语法是:
preg_match('/hello|i am|dumb/', $ohreally);
我怀疑其中的任何一种方式都有很多,但如果 strpos()
方法根据您正在搜索的字符串数量更快,我也不会感到惊讶。 strpos()
的性能会随着搜索项数量的增加而降低。正则表达式可能会,但不会那么快。
显然正则表达式更强大。例如,如果你想匹配单词“dumb”而不是“dumber”,那么这很容易完成:
preg_match('/\b(hello|i am|dumb)\b/', $ohreally);
用 strpos()
做起来要困难得多。
注意:从技术上讲,\b
是零宽度字边界。 “零宽度”意味着它不消耗输入字符串的任何部分,单词边界意味着它匹配字符串的开头、字符串的结尾、从单词(数字、字母或下划线)字符到非-单词字符或从非单词字符到单词字符的过渡。非常有用。
编辑:还值得注意的是,您对 strpos()
的使用不正确(但很多人都犯了同样的错误)。即:
if (strpos ($ohreally, 'hello')) {
...
}
如果指针在字符串中的位置0,则不会进入条件 block 。正确的用法是:
if (strpos ($ohreally, 'hello') !== false) {
...
}
因为类型杂耍。否则 0 被转换为 false。
关于php - 顺序 strpos() 比具有一个 preg_match 的函数更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2093535/
Warning: strpos() [function.strpos]: Empty delimiter 是什么意思? 我有这个: if(strpos(''', $text) ===
我知道,有人问过这个问题,但不幸的是,没有解决这个问题的答案。 这出现在我的日志文件中: PHP 消息:PHP 警告:strpos():第 479 行中的字符串中不包含偏移量 不幸的是,我无法理解导致
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章strpos() 函数判断字符串中是否包含某字符串的方法由作者收集整理,
问题,下面是怎么执行echo的: $str = "Hello World"; if (strpos($str, 'He') !== false) { echo 'GOOD'; } 但这不是:
我使用的是 PHP 版本 5.1.6 我有一个字符串( session 文件)并且需要从中提取一个值,所以我在字符串中搜索针但它返回 false,我将代码缩减为: $string = ';SERVER
我正在使用这段代码来查找字符串中是否存在子字符串,但是当它遇到特殊字符时,即使该字符明显存在,它也会失败。 //Code out of context if (strpos($pieces[$i],
所以目前我有以下两个数组: Array ( [0] => image/jpeg [1] => image/png [2] => image/psd ) Array ( [0] => png [1] =
我需要检查字符串是否包含特定单词,但请记住,中间可能有空格(任何类型 - 空格、制表符等)。 $array1 = "name @mail lastname"; $array2 = "name @ ma
因此,我的网站收到了大量垃圾邮件。 为了过滤掉其中的一些内容,我想测试帖子的正文以确保它不包含某些词。如果他们这样做,请立即(临时)禁止用户。 包括我的代码。我添加了一条回显线来显示返回的位置,并测试
我正在尝试使用 strpos 在另一个字符串中查找字符串,但由于某种原因它不适用于某个字符串,即使它适用于另一个字符串。我究竟做错了什么? 结果: true2 预期结果: true1true2 最佳
我在 php 中有一个函数,我想对一个字符串执行简单的搜索,使用 kw 作为搜索短语,如果找到则返回 true。 这是我现在拥有的: for($i=0; $i
我一直在努力反对谷歌试图解决这个问题,但我所能找到的只是那些不明白 strpos 返回找到的字符串的位置的人,所以 0 是一个有效值。这不是我的问题......简而言之: $services=shel
我有一个巨大的 html 代码要扫描。直到现在我一直在使用 preg_match_all从中提取所需的部分。从一开始的问题就是它非常耗费 CPU 时间。我们最终决定使用其他方法进行提取。我在一些文章中
我正在尝试用 PHP 进行一些验证,其中之一是检查输入的字符串中是否有特定的单词。问题是,当我将指定的单词放在第一位时,我的代码似乎无法正常工作。 代码如下: $word = "aa bb cc dd
更新:我在查看strrpos 的文档时认为它是strpos 的文档。很抱歉犯了这个愚蠢的错误。 根据 the docs ,它表示当您提供一个负值作为偏移量参数时,该函数将从字符串末尾开始那么多字符,向
我在 stackoverflow 上找到了这个例子: if (strpos($a,'are') !== false) { echo 'true'; } 但是我如何让它搜索两个词。我需要这样的东
我需要找出一个字符串是否存在于数组值中,但不一定是实际的数组值。 $array = array( 0 => 'blue', 1 => 'red', 2 =>
仅当 $_GET['page'] 参数包含文本“mytext-”时,我才需要执行一些脚本 查询字符串是:admin.php?page=mytext-option 这将返回 0: $myPage = $
我已经为我的网络应用编写了一个基本的“安全检查程序”。我需要看一眼用户提交的代码是否包含恶意内容。 这是我现在正在运行的代码的屏幕截图:http://cl.ly/677a6dc40034f096697
我正在使用 strpos() 函数在数组键成员中查找字符串。 foreach($_POST as $k => $v){ // for all types of questions of
我是一名优秀的程序员,十分优秀!