php:preg_match和preg_replace

时间:2015-06-25 06:41:36

标签: php regex preg-replace preg-match

我不确定如何做以下事情......

我需要搜索string并匹配forward slashcertain letters的所有实例。这是用户能够输入的单词修改,我希望他们能够修改单个单词。

这是一个示例字符串

  

您好,今天天气不是绝对美丽!?

我希望用户能够做的是这样的

  

你好,今天不是/ bo天气/它很漂亮!?

注意/bo/it

我想要做的是使用preg_matchpreg_replace语句查找并替换/bo/it的实例,并将其转换为html像bolded html tagitalics html tag这样的标签(我不能在这里输入它们或者它们会被转换为实际的html。但是在/bo之后紧跟着这个词,所以在这个例子中它会结束是

Hello, isn't the <b>weather</b> just <i>beautiful</i> today!?

如何使用regex

来解决这个问题

转换完成后,我会在将数据与预准备语句一起插入数据库之前进行标准清理。

3 个答案:

答案 0 :(得分:2)

$string = "Hello, isn't the /bo weather just /it beautiful /bo today!?";

var_dump(preg_replace (array('/\/bo\s(\w+)/', '/\/it\s(\w+)/'), array('<b>$1</b>', '<i>$1</i>'), $string));

&#34;您好,天气 美丽 今天!&#34;

答案 1 :(得分:1)

您可以使用preg_replace_callback来实现此目的 这基本上为每次发生的匹配调用回调方法 在回调中,您可以根据您的条件进行更换(对于bo的粗体,对于它的斜体,朝向他等)。

像这样的东西 -

$str = "Hello, isn't the /bo weather just /it beautiful today!?";
$regex = "/\/(.*?)\s+(.+?)\b/";

function callback($matches){
    $type = $matches[1];
    $text = $matches[2];
    switch($type){
        case "bo":
            return "<b>".$text."</b>";
            break;
        case "it":
            return "<i>".$text."</i>";
            break;
        default:
            return $text;
    }   
}

$resp = preg_replace_callback(
    $regex,
    "callback",
    $str
);

var_dump($resp);

/*
OUTPUT- 
Hello, isn't the <b>weather</b> just <i>beautiful</i> today!?
*/

通过检查各种类型和无效类型

,可以进一步扩展此示例

答案 2 :(得分:0)

正则表达式

/\/(bo|it)\s+([\S]+)(?=\b)/g

和替换字符串

<$1>$2</$1>

几乎这样做:

Hello, isn't the <bo>weather</bo> just <it>beautiful</it> today!?

但标签还不是很正确......它们需要是单个字母。 : - (

在此尝试:https://regex101.com/r/oB9gT0/1

<强> 2。编辑 - 有点晚了,但现在可行了:

$str=preg_replace('/\/([bi])((?<=b)o|(?<=i)t)\s+([\w]+)/','<$1>$3</$1>',$str);

现在可以提供正确的结果:

Hello, isn't the <b>weather</b> just <i>beautiful</i> today!?

见这里:https://regex101.com/r/oB9gT0/3