我有一个字符串需要处理:
$str=“Lorem ipsum dolor before MY KEYWORD 1 After After,sed do eiusmod temporate incidedut ut before MY KEYWORD 2 After et dolore magna aliqua.ut enim ad minim veniam,quis before MY KEYWORD 1 After execution ullamco laboris nisi ut aliquip ex ea commodo consequat”;
$arr_keywords = array("MY KEYWORD 1", "MY KEYWORD 2");
=
array(
before Before MY KEYWORD 1 After after,
before Before MY KEYWORD 1 After after,
before Before MY KEYWORD 2 After after
)
结果:
“在我的关键词之前1之后,在我的关键词之前2之后,在我的关键词之前2之后,在我的关键词之前2之后。Ut Unim ad minim vUniam, quis之前在我的关键字1之后Ux排泄乌兰科劳动是不可用的Ux Ua commodo consUquat”
对如何做到这一点有什么建议吗?
谢谢
构建要查找的分隔符的regexp,并使用before/after business进行扩展:
$regexp = '('
. implode(
'|',
array_map(
function ($s) {return "before Before $s After after";},
$arr_keywords)
)
. ')';
根据这些分隔符将字符串拆分
$chunks = preg_split("/$regexp/", $str, -1, PREG_SPLIT_DELIM_CAPTURE);
通过迭代块来构建新字符串:
$new = '';
foreach ($chunks as $c) {
$new .= preg_match("/$regexp/", $c)
? $c
: str_replace('e', 'U', $c);
}
看看你是怎么做的:
$str = 'Lorem ipsum dolor before Before MY KEYWORD 1 After after, sed do eiusmod tempor incididunt ut before Before MY KEYWORD 2 After after et dolore magna aliqua. Ut enim ad minim veniam, quis before Before MY KEYWORD 1 After after exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat';
$arr_keywords = array("MY KEYWORD 1", "MY KEYWORD 2");
$currpos = 0;
$newstr = '';
$kwds_plus_surround = array();
$len = strlen($str);
while ($currpos < $len) {
// Search for the earliest match of any of the keywords from our current position.
list($newpos, $kw_index) = strpos_arr($str, $arr_keywords, $currpos);
if ($newpos == -1) {
// We're beyond the last keyword - do replacement to the end and
// add to the output.
$newstr .= do_replace(substr($str, $currpos));
$currpos = $len + 1;
} else {
// Found a keyword.
// Now look two words back (separating words on single spaces).
$secondspc_back = $newpos - 1;
for ($i = 2; $i > 0; $i--) {
$secondspc_back = strrpos($str, ' ', $secondspc_back - $len - 1);
if ($secondspc_back === false) break;
}
if ($secondspc_back === false || $secondspc_back < $currpos) {
$secondspc_back = $currpos;
} else $secondspc_back++;
// Do replacement on the stuff between the previous keyword
// (plus 2 words after) and this one (minus two words before),
// and add to the output.
$in_between = substr($str, $currpos, $secondspc_back - $currpos);
$newstr .= do_replace($in_between);
// Now look two words forward (separating words on single spaces).
$secondspc_fwd = $newpos + strlen($arr_keywords[$kw_index]);
for ($i = 2; $i > 0; $i--) {
$secondspc_fwd = strpos($str, ' ', $secondspc_fwd + 1);
if ($secondspc_fwd === false) break;
}
if ($secondspc_fwd === false) $secondspc_fwd = $len + 1;
// Add the keyword plus two words before and after to both the array
// and the output.
$kw_plus = substr($str, $secondspc_back, $secondspc_fwd - $secondspc_back);
$kwds_plus_surround[] = $kw_plus;
$newstr .= $kw_plus;
// Update our current position in the string.
$currpos = $secondspc_fwd;
}
}
echo 'ORG: '.$str."\n\n".'NEW: '.$newstr."\n\n";
var_export($kwds_plus_surround);
// Finds the earliest match, if any, of any of the $needles (an array)
// in $str (a string) starting from $currpos (an integer).
// Returns an array whose first member is the index of the earliest match,
// or -1 if no match was found, and whose second member is the index into
// $needles of the entry that matched in the $str.
function strpos_arr($str, $needles, $currpos) {
$ret = array(-1, -1);
foreach ($needles as $idx => $needle) {
$offset = stripos($str, $needle, $currpos);
if ($offset !== false &&
($offset < $ret[0] || $ret[0] == -1)) {
$ret = array($offset, $idx);
}
}
return $ret;
}
// Replaces in $str all occurrences of 'e' with 'U'.
function do_replace($str) {
return str_replace('e', 'U', $str);
}
问题内容: 我必须从关键字后的SQL字段中的文本中提取内容。例如,如果我在表中有一个名为description的字段,并且该字段的表内容为: asdasf关键字狗 aeee关键字cat ffffaa关键字狼 我想提取并保存“关键字”之后的文本(在本例中为“狗,猫和狼”),然后将其保存在视图中,或者简单地通过选择显示它。谢谢你。 问题答案: 这是一个使用示例: 另一个例子: 结果: 请注意,此字符串
关键字替换 Subversion具备添加关键字的能力—一些有用的,关于版本化的文件动态信息的片断—不必直接添加到文件本身。关键字通常会用来描述文件最后一次修改的一些信息,因为这些信息每次都有改变,更重要的一点,这是在文件修改之后,除了版本控制系统,对于任何企图保持数据最新的过程都是一场混乱,作为人类作者,信息变得陈旧是不可避免的。 举个例子,你有一个文档希望显示最后修改的日期,你需要麻烦每个作者提
问题内容: 我有一个由三部分组成的字符串。我希望字符串是(更改),单独的部分(不更改)和最后一个更改的部分。我要删除分隔部分和结尾部分。分离的部分是“-”,所以我想知道的是,是否有办法删除字符串中一定部分之后的所有内容。 这种情况的一个示例是,如果我想将其转换为:“ Stack Overflow-一个地方来问问题”:任何帮助表示赞赏! 问题答案: 例如,您可以这样做: 要么 (并添加相关的错误处理
问题内容: 我想,以取代过去的字符串,它是一个,与) 假设字符串是: -Insert into dual (name,date, 转换为: -Insert into dual (name,date) 问题答案: 以下代码应将的最后一次出现替换为。 注意 如果不含,则会抛出Exception 。
问题内容: 这将所有特殊字符替换为“”(空格)。 但是我尝试将破折号“-”排除为特殊字符。 这是我的尝试: 但这不是我期望的。 问 :如何进行这项工作? 问题答案: 如果要匹配除以外的所有字符,可以使用: 例如:
我想要成功 用大括号()或[]替换的文本可从表1或表2中找到。 当前方法 如何改进代码跳过非必需循环?