我正在学习PHP,并在文本文件脚本中构建了一点搜索。这是一系列事件:
我的问题是:
如果我有一句话:
汤姆手里拿着相机。我也是地板上的相机。搜索" am",搜索并找到相机,用span类替换它。然后它发现" am"并在相机中取代它两次,以及它本身。
这是我的代码:
//---- Puts Array into or responds with error
$lines = file($filename, FILE_IGNORE_NEW_LINES);
if ( !is_array($lines) ) {
echo 'Cannot create array from file';
}
//---- Scans and Displays Lines
$submission = $_GET['Search'];
function scanLines($lines, $submission) {
foreach($lines as $line) {
if(strpos($line,$submission)!== false){
preg_match_all("/\b[a-z]*".preg_quote($submission)."[a-z]*\b/i", $line, $matches);
$i = 0;
foreach($matches[$i] as $match) {
$line = str_replace($match, '<span class="highlight">'.$match.'</span>', $line);
$i++;
}
echo $line;
}
}
}
指向示例的直接链接:http://www.effectivemark.com/testphp/
我的问题是:过滤掉&#34; am&#34;的最佳方法是什么?在相机中,所以它不会添加带有span标签的字符串,如下所示:
<span class="highlight">c<span class="highlight">am</span>era</span>
更新的代码:
//---- Scans and Displays Lines
$submission = $_GET['Search'];
function scanLines($lines, $submission) {
foreach($lines as $line) {
if(strpos($line,$submission)!== false){
$words = explode(' ', $line);
$i = 0;
$combine = array();
foreach($words as $word) {
if (preg_match("/\b[a-z]*".preg_quote($submission)."[a-z]*\b/i", $word)) {
preg_match_all("/\b[a-z]*".preg_quote($submission)."[a-z]*\b/i", $word, $match);
$matches = '<span class="highlight">' . $match[0][0] . '</span>';
}
else {
$matches = $word;
}
array_push($combine, $matches);
$i++;
}
foreach($combine as $combined) {
echo $combined . ' ';
}
}
}
}
答案 0 :(得分:3)
你最好将线条划分为单词,这样可以很容易地将它们匹配
答案 1 :(得分:0)
我认为这样可以:
<form action="" method="post">
<h4>Search Object In Text File:</h4>
<input type="text" name="search" value="">
<input type="submit" value="Submit" name="Submit">
</form>
<?php
$filename="tekst.txt";
$lines = file($filename, FILE_IGNORE_NEW_LINES);
if ( !is_array($lines) ) {
echo 'Cannot create array from file';
}
//---- Scans and Displays Lines
if(isset($_POST['search']))
$submission = $_POST['search'];
scanLines($lines,$submission);
function scanLines($lines, $submission) {
foreach($lines as $line) {
$word_arr=str_word_count($line,1);
$length=count($word_arr);
for($i=0;$i<$length;$i++) {
if(preg_match("#$submission#",$word_arr[$i],$match)) {
$word_arr[$i]='<span class="highlight">'.$word_arr[$i].'</span>';
$new_line=implode(' ',$word_arr);
echo $new_line.'<br>';
}
}
}
}
?>
所以,如果你想搜索任何一部分的词,并突出整个词,而不是只匹配部分。对于完整(更严格)的全字搜索,您可以使用简单的in_array()函数。