请帮我写regex-replace


Please help me write regex replace

我还没有掌握regex,所以非常感谢您对代码的帮助。

我需要更换所有线路:

  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

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

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

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

感谢

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);
}

查看它的工作

这是我的版本。

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

演示

代码:

<?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';
function replaceString($string){
   return   preg_replace('/^'s*(['{,'[,'(]+?)/', "%%$1", $string);
}