通过搜索两次vqmod高级搜索

时间:2014-11-17 09:40:05

标签: vqmod

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

假设我有这段代码,需要将其转换为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>

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

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

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

  1. 搜索:$this['data'][] = array(找到此行号。
  2. 然后从此行号开始下一次搜索,找到下一个出现的地点:);
  3. 然后可以将同样的想法应用于我想在返回的数据之前添加一些逻辑的方法。

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

1 个答案:

答案 0 :(得分: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只能搜索单行单行部分。