2

我还没有掌握正则表达式,因此非常感谢您对代码的帮助。

我需要替换所有行:

  1. 以方括号或圆括号开头;
  2. 可能包含最多 3 个数字的常规数字或最多 3 个字母的组合;
  3. 后面可以是句号;
  4. 哪个数字或数字可能在也可能不在里面或者标签。

这是需要替换的示例:

(1)blahblah => %%(1)|blahblah
(<i>iv</i>.) blahblah => %%(<i>iv</i>.)|blahblah
[b] &nbsp;some stuff => %%[b]|&nbsp;some stuff

所以正则表达式需要识别它是否需要应用于特定的字符串,如果是,则将 %% 放在行首,然后将内容放在括号内,然后放一个管道 | (如果括号和文本的其余部分之间有空格,则删除空格),最后放置该行的其余部分。

因此,假设我有一个数组,我试图通过函数运行该数组,该函数将处理字符串(如果它符合条件),或者将其原封不动地返回。

我只需要知道如何编写函数。

谢谢

4

3 回答 3

3
function my_replace ($str) {
    $expr = '~
        (
            # opening bracket or paren
            (?:\(|\[) 
                 # optional opening tag
                 (?:<([a-z])>)?
                 # either up to 3 digits or up to 3 alphas
                 (?:[a-z]{1,3}|[0-9]{1,3})
                 # optional closing tag
                 (?:</\2>)?
                 # optional dot
                 \.?
             # closing bracket or paren
             (?:\)|])
         )
         # optional whitespace
         \s*
         # grab the rest of the string
         (.+)
    ~ix';
    return preg_replace($expr, '%%$1|$3', $str);
}

看到它工作

于 2012-09-14T22:11:39.137 回答
2

这是我的版本。

如果第一个不匹配,它使用后备正则表达式(如前所述)。

演示

代码:

<?php
function do_replace($string) {
    $regex = '/^(\((?:<([a-z])>)?(\d{0,3}|[a-z]{1,3})(?:<\/\2>)?(\.)?\)|\[(?:<([a-z])>)?(\d{0,3}|[a-z]{1,3})(?:<\/\2>)?(\.)?\])\s*(.*)/i';
    $result = preg_match($regex, $string);
    if($result) {
        return preg_replace($regex, '%%$1|$8', $string);
    } else {
        $regex = '/^(\d{0,3}|[a-z]{1,3})\.\s*(.+)$/i';
        $result = preg_match($regex, $string);
        if($result) {
            return preg_replace($regex, '%%$1.|$2', $string);
        } else {
            return $string;
        }
    }
}
$strings = array(
    '(1)blahblah',
    '(<i>iv</i>.) blahblah',
    '[b] &nbsp;some stuff',
    '25. blahblah',
    'A. some other stuff. one',
    'blah. some other stuff',
    'text (1) text',
    '2008. blah',
    '[123) <-- mismatch'
);
foreach($strings as $string) echo do_replace($string) . PHP_EOL;
?>

第一个正则表达式展开:

$regex = '
    /
        ^(
            \(
                (?:<([a-z])>)?
                (
                    \d{0,3}
                    |
                    [a-z]{1,3}
                )
                (?:<\/\2>)?
                (\.)?
            \)
            |
            \[
                (?:<([a-z])>)?
                (
                    \d{0,3}
                    |
                    [a-z]{1,3}
                )
                (?:<\/\2>)?
                (\.)?
            \]
        )
        \s*
        (.*)
    /ix';
于 2012-09-15T00:53:12.023 回答
-2
function replaceString($string){
   return   preg_replace('/^\s*([\{,\[,\(]+?)/', "%%$1", $string);
}
于 2012-09-14T09:30:35.920 回答