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 に答える