当过滤要显示的项目时,如果我要搜索的单词是该项目的第一个单词,则它找不到它。示例:我有标题," 明天将是晴天"。如果我找明天,就找不到它,如果我找晴天或那天,它确实如此。如何搜索包括第一个单词在内的整个句子? 这是代码:
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'
答案 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
的第三个可选参数调用true
。 According to the documentation stristr
函数在第一次出现针头(不包括针头)之前返回干草堆的部分。
并且因为明天位于字符串的开头明天将是晴天然后返回的值是空字符串,这被解释为false:
("" == false) -> true
结论
如果将第三个参数保留为true
,则在字符串开头出现空字符串时出现问题,如果将其设置为false
或将其删除(它是默认值为false的可选参数),则返回空字符串的问题出现在字符串末尾的单词。
因此,无论使用true / false作为第三个参数,原始答案中提出的解决方案都可以处理这两种情况。