Filter和stristr():找到除第一个之外的所有单词

时间:2018-03-10 10:04:06

标签: php arrays function collections filter

当过滤要显示的项目时,如果我要搜索的单词是该项目的第一个单词,则它找不到它。示例:我有标题," 明天将是晴天"。如果我找明天,就找不到它,如果我找晴天那天,它确实如此。如何搜索包括第一个单词在内的整个句子? 这是代码:

Traceback (most recent call last):
  File "collect_links.py", line 23, in <module>
    href=link.get("href") + ("\n")
TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'

2 个答案:

答案 0 :(得分:1)

<?php

$haystack = 'Tomorrow will be a sunny day';
$needles  = ['tomorrow', 'foo', 'sunny', 'day'];

foreach($needles as $needle) {
    if (stristr($haystack, $needle) !== false)
        printf ("'%s' found in '%s'\n", $needle, $haystack);
    else
        printf("'%s' not found in '%s'\n", $needle, $haystack);
}

输出:

'tomorrow' found in 'Tomorrow will be a sunny day'
'foo' not found in 'Tomorrow will be a sunny day'
'sunny' found in 'Tomorrow will be a sunny day'
'day' found in 'Tomorrow will be a sunny day'

答案 1 :(得分:0)

显然可能是将0(零)视为假的问题。

如果字符串在第一个位置,即。位置0,测试是否找到,则零值被解释为假。但在这种情况下,它在零位置上成功找到。

为了避免这种行为,不仅要比较值,还要比较类型。

(0 == false) -> true

但是

(0 === false) -> false

所以测试次数应该像($position !== false)

返回布尔值而不是位置:

return (stristr($item['title'], $request->texto, true) !== false) ? true : false;

修改
正如@Progrock正确指出的那样,函数stristr不返回位置,它返回子字符串或false。

因此在字符串开头找不到单词的根本原因是其他地方。

函数stristr执行不区分大小写的搜索,如果找到了字符串,并且找到 tommorow ,则返回的值为string。字符串被视为 true ,因此比较的工作方式如下:

 ("string" == false) -> false

但是,使用设置为stristr的第三个可选参数调用trueAccording to the documentation stristr函数在第一次出现针头(不包括针头)之前返回干草堆的部分。
并且因为明天位于字符串的开头明天将是晴天然后返回的值是空字符串,这被解释为false:

("" == false) -> true

结论
如果将第三个参数保留为true,则在字符串开头出现空字符串时出现问题,如果将其设置为false或将其删除(它是默认值为false的可选参数),则返回空字符串的问题出现在字符串末尾的单词。

因此,无论使用true / false作为第三个参数,原始答案中提出的解决方案都可以处理这两种情况。