1
DearTanker 2014-11-14 13:41:39 +08:00
我也想知道这段关于PHP正则查询代码会出错的问题,该怎么办?
if ($s) {$title = preg_replace('/('.implode('|', $keys) .')/iu','<span style="color:#f40f40;text-decoration:underline;">\0</span>',$title);} ?> 具体错误是没办法找到“*”。会报错 Warning: preg_replace(): Compilation failed: nothing to repeat at offset |
2
feiyuanqiu 2014-11-14 13:53:42 +08:00
@DearTanker *是一个正则符号 需要在前面加个反斜杠 \*
|
3
DearTanker 2014-11-14 15:16:46 +08:00
|
4
abelyao 2014-11-14 15:18:22 +08:00
半吊子码农你好… 我每天都能看到你上来问几个问题,爱学习的孩子,要给你点个赞先
|
5
DearTanker 2014-11-14 15:20:31 +08:00
@feiyuanqiu 就像:
http://www.huging.com/?s=\* 和 http://www.huging.com/?s=* 请问、这段代码可以优化吗? 顺手贴一下代码: <?php newtheme_switch('header.php') ?> <div id="content"> <div class="goods<?php if(is_mobile()){echo ' ajax';}else{ ajax_ias();} ?>"> <?php if(have_posts()):query_posts($query_string .'&showposts='.newtheme_showposts()); echo '<p id="prompt">以下是为您搜索到的信息,如果没有您想要的,可尝试缩短或更换关键词。</p>'; while(have_posts()):the_post(); $title = get_the_title(); $keys = explode(" ",$s); if ($s) {$title = preg_replace('/('.implode('|', $keys) .')/iu','<span style="color:#f40f40;text-decoration:underline;">\0</span>',$title);} ?> <article> <a class="thumbnail" href="<?php the_permalink() ?>" title="<?php the_title(); ?>"<?php target_blank() ?>> <?php newtheme_thumbnail() ?> </a> <?php if(newtheme_cn('links','link_url')): if(newtheme_cn('goods','widget')): ?> <span class="ali_625"><a data-type="0" biz-itemid="<?php ali_goods_id() ?>" data-tmplid="625" data-rd="2" data-style="2" data-border="0" href="#"></a></span> <?php else : ?> <a class="buy" href="<?php links_url() ?>" rel="nofollow noopener" target="_blank"><?php links_title() ?></a> <?php endif;endif ?> <h2> <a href="<?php the_permalink() ?>" title="详细阅读:<?php the_title() ?>"<?php target_blank() ?>><?php echo $title ?></a><?php if(newtheme_cn('goods','subhead')):?><span class="subhead"><?php echo newtheme_cn('goods','subhead') ?></span><?php endif ?> </h2> <p class="info"> <time class="icon-time"><?php the_time( get_option('date_format') ) ?></time> <span class="cat icon-star"><?php newtheme_ie('分类:');the_category('、') ?></span> <?php newtheme_like('<span class="icon-like"></span>',' 喜欢') ?> </p> <p class="desc"><?php echo newtheme_excerpt(120) ?> <a href="<?php the_permalink() ?>" class="readmore" title="详细阅读:<?php the_title() ?>"<?php target_blank() ?>>查看全文</a></p> </article> <?php endwhile; else: echo '<p id="prompt">非常抱歉,无法搜索到您可能需要的信息,我们为您随机推荐了以下文章。</p>'; $cat = get_option('cat_limit'); $showposts = newtheme_showposts(); $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; $args = array( 'order' => DESC, 'orderby' => 'rand', 'cat' => $cat, 'post__not_in' => get_option('sticky_posts'), 'showposts' => $showposts, 'paged' => $paged ); query_posts($args); while (have_posts()) : the_post(); if(is_mobile()){ include('mobile/goods.php'); }else{ include('pc/goods.php'); } endwhile;wp_reset_query(); endif; ?> <?php newtheme_paging() ?> </div> </div> <?php newtheme_switch('footer.php') ?> |
6
feiyuanqiu 2014-11-14 15:25:07 +08:00
@DearTanker 我明白你的意思。
if ($s) { $title = preg_replace('/('.implode('|', $keys) .')/iu','<span style="color:#f40f40;text-decoration:underline;">\0</span>',$title); } 你这段代码的作用是 通过构造正则匹配式把$title中的搜索项$keys高亮出来 当你搜索*时,实际构造出来的正则是:'/key1|*|key2/iu' *在正则里面表示匹配0或多个,这里就出问题了 如果要搜索*,需要给*加反斜杠 \*,也就是最终构造出来的正则应该是:'/key1|\*|key2/iu' 这样才行。 |
7
DearTanker 2014-11-14 15:28:40 +08:00
@feiyuanqiu 对,= =关键是怎么改,我试着把\添加了几个地方发现都不行= =,PS:我不懂代码T.T
|
8
watsy0007 2014-11-14 15:34:32 +08:00
基本所有语言里面都关于字符串类型都会有1个函数。
split,专门用于拆解字符串为数组 |
9
msg7086 2014-11-14 15:52:09 +08:00 1
@DearTanker 你是把用户输入的内容直接当成正则来搜
那么必然用户输入的内容 *得是正则才行*。 要么自己写搜索算法,要么就把原始输入里是正则关键字的那些部分转义掉。典型的比如 . * + { } [ ] ( ) | ^ $ \ 都是要转义的。 |
10
feiyuanqiu 2014-11-14 15:59:30 +08:00 1
@DearTanker 这个时候就该去招人了...
或者把这段代码加上去将就用下,没有仔细测试,可能有bug... if ($s) { // 下面这段是新添加的,放在这里就行 $keys = preg_replace('/(\\' . implode('|\\', array('\\', '^', '$', '*', '+', '?', '{', '}', ',', '?', '.', '(', ')', '[', ']', '-')) . ')/i', '\\\\$0', $keys); // 原代码 $title = preg_replace('/('.implode('|', $keys) .')/iu','<span style="color:#f40f40;text-decoration:underline;">\0</span>',$title); } |
11
WildCat 2014-11-14 16:04:57 +08:00 via iPhone
unserialize()
serialize() |
12
DearTanker 2014-11-14 16:07:21 +08:00
|
13
DearTanker 2014-11-14 16:07:46 +08:00
@msg7086 还有你,感谢啦~
|
14
feiyuanqiu 2014-11-14 16:11:05 +08:00
....啊啊啊啊,上面我的代码作废
$title = preg_replace('/('.implode('|', array_map('preg_quote', $keys)) .')/iu','<span style="color:#f40f40;text-decoration:underline;">\0</span>',$title); echo($title); 这样就行了 |