当前位置: 首页 > 知识库问答 >
问题:

PHP在关键字前后提取字符串的一部分,然后替换除关键字以外的所有内容

蒲寂离
2023-03-14

我有一个字符串需要处理:

$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");
  1. 在关键字前后提取字符串的一部分:

=

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”

对如何做到这一点有什么建议吗?

谢谢

共有2个答案

钱运浩
2023-03-14

构建要查找的分隔符的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);
}
汝楷
2023-03-14

看看你是怎么做的:

$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中找到。 当前方法 如何改进代码跳过非必需循环?