1

我遇到了一个问题,我需要搜索一行太常见的代码。

假设我有这段代码,需要将其转换为 array_merge:

$this['data'][] = array(
    'firstname'      => $query->row['firstname'],
    'lastname'       => $query->row['lastname'],
    'company'        => $query->row['company'],
    'company_id'     => $query->row['company_id']
);

vqmod

<operation>
    <search position="replace"><![CDATA[
    $this['data'][] = array( ]]></search>
    <add><![CDATA[
    $this['data'][] = array_merge($data, array( ]]></add>
</operation>
<operation>
    <search position="replace"><![CDATA[
    ); ]]></search>
    <add><![CDATA[
    )); ]]></add>
</operation>

问题在于它试图搜索太常见的代码。

我可以使用偏移量来替换整个东西,因为我们使用其他扩展来修改同一个数组。也不能相信 company_id 总是最后的。

所以相反,我在想是否有一种方法可以搜索两次或类似于这个概念:

  1. 搜索:$this['data'][] = array(找到这个的行号。
  2. 然后从此行号开始下一次搜索,找到下一次出现的:);

然后可以将相同的想法应用于我想在返回数据之前添加一些逻辑的方法。

<operation>
    <search position="before"><![CDATA[
    private static function _cacheName ]]></search>
    <search2><![CDATA[
    return ]]></search2>
    <add><![CDATA[
    // custom code ]]></add>
</operation>
4

1 回答 1

0

您可以使用index. 如 vqmod 的脚本手册中所述,您可以指定要使用的结果。因此,下面的代码将找到文本的第二次出现并将其替换为指定的部分:

<operation>
  <search position="replace" index="2"><![CDATA[
  $this['data'][] = array( ]]></search>
  <add><![CDATA[
  $this['data'][] = array_merge($data, array(]]></add>
</operation>

您可以将相同的内容应用于关闭);。或者,您可以尝试找出该数组中有多少行,并且可以使用带有替换的偏移量:

<operation>
  <search position="replace" index="2" offset="4"><![CDATA[
  $this['data'][] = array( ]]></search>
  <add><![CDATA[
  ));]]></add>
</operation>

一个好的起点是检查 vqcache 文件夹中被修改的文件,这样你就会知道你应该偏移多少行。

需要注意的是, vqmod 只能搜索单行或单行的一部分

于 2014-11-18T13:20:06.407 回答