在字符串中的每个单词后添加字符(多字节安全)

问题描述 投票:0回答:4

如何在每个单词后使字符内爆?

我尝试过以下方法:

$query = implode("* ", preg_split("/[\s]+/", $query));

但它总是忽略一个词。例如:

test test
会给我
test* test
test
会给我
test
,测试测试测试测试会给我
test* test* test* test

也尝试过

$query = implode("*", str_split($query));
,但如果查询是西里尔字符,它会给我乱码。

php implode multibyte
4个回答
2
投票

implode
将字符串连接在一起,并在每个项目之间插入一个“粘合字符串”。

如果您想更改每个字符串,可以使用

array_map
来代替。

implode(array_map(function($item) { return $item . '* '; }, $array));

我希望你没有用数据库查询做一些奇怪的事情(考虑你的变量名)。如果您想使用变量数据库查询,请改用参数化查询。

另一个“黑客”是内爆数组,然后在结果字符串的末尾插入丢失的字符串:

implode('* ', $array) . '* ';

1
投票

试试这个

<?php

$str = 'test test test test test';  
$str = implode("* ", explode(" ", $str))."* ";

echo $str;

0
投票

尝试其他答案,或者您也可以使用

preg_replace
。但不推荐。当有一些干净的替代品可用时,避免使用
regex

<?php
  $query  = preg_replace( "/[\s]+/", "* ", $query )."*";
  echo $query;
?>

使用

array_map

<?php
  $query  = explode( " ", "test test test test test" );
  $query  = array_map( function( $val ) {
    return trim( $val )."* ";
  }, $query );
  $query  = implode( "", $query );
  echo $query;
?>

0
投票

最直接的是,使用

preg_replace()
在每个单词后面插入
*

\w+
将匹配一个或多个字母数字或下划线字符。
\K
告诉函数重新开始完整字符串匹配——以便在替换过程中不会删除任何字符。

代码:(演示

$string = 'test test test test';

echo preg_replace("/\w+\K/", '*', $string);
// output: test* test* test* test*

对于多字节字符(例如西里尔字母),请添加

u
模式修饰符。

代码:(演示

$string = 'слово слово слово слово';

echo preg_replace("/\w+\K/u", '*', $string);
// output: слово* слово* слово* слово*
© www.soinside.com 2019 - 2024. All rights reserved.