我还没有掌握regex,所以非常感谢您对代码的帮助。
我需要更换所有线路:
- 以括号或圆括号开头
- 其可以包含多达3个数字的规则数或者多达3个字母的组合
- 其之后可以是一段时间
- 哪个数字或数字可能在或标签内,也可能不在
以下是需要替换的示例:
(1)blahblah => %%(1)|blahblah
(<i>iv</i>.) blahblah => %%(<i>iv</i>.)|blahblah
[b] some stuff => %%[b]| 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] 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);
}