草庐IT

php - 使用正则表达式和四行上下文匹配搜索

coder 2024-04-20 原文

比如我有这样一段代码:

<?php
/**
 * Order
 *
 * The WooCommerce order class handles order data.
 *
 * @class       WC_Order
 * @version     1.6.4
 * @package     WooCommerce/Classes
 * @category    Class
 * @author      WooThemes
 */
class WC_Order {

    /** @public int Order (post) ID */
    public $id;

    /** @public string Order status. */
    public $status;

    /** @public string Order date (placed). */
    public $order_date;

    /** @public string Order date (paid). */
    public $modified_date;

    /** @public string Note added by the customer. */
    public $customer_note;

    /** @public array Order (post) meta/custom fields. */
    public $order_custom_fields;

        global $wpdb, $woocommerce;

        if ( empty( $type ) )
            $type = array( 'line_item' );

        if ( ! is_array( $type ) )
            $type = array( $type );

        $items = $this->get_items( $type );

        $count = 0;

        foreach ( $items as $item ) {
            if ( ! empty( $item['qty'] ) )
                $count += $item['qty'];
            else
                $count ++;
        }

        return apply_filters( 'woocommerce_get_item_count', $count, $type, $this );
    }

    /**
     * Return an array of fees within this order.
     *
     * @access public
     * @return array
     */
    public function get_fees() {
        return $this->get_items( 'fee' );
    }

    /**
     * Return an array of taxes within this order.
     *
     * @access public
     * @return void
     */
    public function get_taxes() {
        return $this->get_items( 'tax' );
    }

    /**
     * Get taxes, merged by code, formatted ready for output.
     *
     * @access public
     * @return void
     */
    public function get_tax_totals() {
        $taxes      = $this->get_items( 'tax' );
        $tax_totals = array();

        foreach ( $taxes as $key => $tax ) {

            $code = $tax[ 'name' ];

            if ( ! isset( $tax_totals[ $code ] ) ) {
                $tax_totals[ $code ] = new stdClass();
                $tax_totals[ $code ]->amount = 0;
            }

            $tax_totals[ $code ]->is_compound       = $tax[ 'compound' ];
            $tax_totals[ $code ]->label             = isset( $tax[ 'label' ] ) ? $tax[ 'label' ] : $tax[ 'name' ];
            $tax_totals[ $code ]->amount           += $tax[ 'tax_amount' ] + $tax[ 'shipping_tax_amount' ];
            $tax_totals[ $code ]->formatted_amount  = woocommerce_price( $tax_totals[ $code ]->amount );
        }

        return apply_filters( 'woocommerce_order_tax_totals', $tax_totals, $this );
    }

    /**
     * has_meta function for order items.
     *
     * @access public
     * @return array of meta data
     */
    public function has_meta( $order_item_id ) {
        global $wpdb;

        return $wpdb->get_results( $wpdb->prepare("SELECT meta_key, meta_value, meta_id, order_item_id
            FROM {$wpdb->prefix}woocommerce_order_itemmeta WHERE order_item_id = %d
            ORDER BY meta_key,meta_id", absint( $order_item_id ) ), ARRAY_A );
    }

    /**
     * Get order item meta.
     *
     * @access public
     * @param mixed $item_id
     * @param string $key (default: '')
     * @param bool $single (default: false)
     * @return void
     */
    public function get_item_meta( $order_item_id, $key = '', $single = false ) {
        return get_metadata( 'order_item', $order_item_id, $key, $single );
}

我想用三个选项匹配所有 Wordpress 钩子(Hook):“do_action”和“apply_filters”: apply_filters( 'woocommerce_order_tax_totals', $tax_totals, $this ), 文件, 行号

可以在这里看到我正在尝试做的一个例子: http://etivite.com/api-hooks/buddypress/trigger/apply_filters/bp_get_total_mention_count_for_user/

http://adambrown.info/p/wp_hooks/hook/activated_plugin?version=3.6&file=wp-admin/includes/plugin.php

我确实尝试拉出一些东西但没有成功:

<?php
$path = $_SERVER['DOCUMENT_ROOT'] . '/wp-content/plugins/iphorm-form-builder';
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $filename) {
    if (substr($filename, -3) == 'php') {
        $file = file($filename);
        if ($file !== false) {
            $matches1 = preg_grep( '/do_action\((.+)\);/', $file);
            $matches2 = preg_grep( '/apply_filters\((.+)\);/', $file );
            $arr = array_filter(array_merge($matches1, $matches2));
            $out = '';
            echo "found in $filename:";
            echo "<pre>";
            foreach ($arr as $key => $value) {
                $out .= $file[$key-2];
                $out .= $file[$key-1];
                $out .= $file[$key];
                $out .= $file[$key+1];
                $out .= $file[$key+2];
            }
            echo htmlentities($out);
            echo "</pre>";
        } else {
            echo "failed reading to array";
        }
    }
}

最佳答案

这可以通过利用内置的 shell 命令非常简单地完成。

<?php
$path = $_SERVER['DOCUMENT_ROOT'] . '/wp-content/plugins/iphorm-form-builder';
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $filename) {
    if (substr($filename, -3) == 'php') {
        $context = shell_exec('grep -H -n -C4 do_action ' . escapeshellarg($filename));
        if (!empty($context)) {
            echo "found in $filename:";
            echo "<pre>";
            echo htmlentities($context);
            echo "</pre>";
        } else {
            echo "failed reading to array";
        }
    }
}

相关文档:

php shell_exec

Execute command via shell and return the complete output as a string

php escapeshellarg

Escape a string to be used as a shell argument

bash grep

   Grep  searches the named input FILEs (or standard input if no files are
   named, or the file name - is given) for lines containing a match to the
   given PATTERN.  By default, grep prints the matching lines.

   -C NUM, --context=NUM
      Print  NUM lines of output context.  Places a line containing --
      between contiguous groups of matches.

   -H, --with-filename
      Print the filename for each match.

   -n, --line-number
      Prefix each line of output with the line number within its input
      file.

编辑

根据项目中目录和文件的数量,它可能性能不佳。您基本上是在新 shell 中为每个文件创建一个新进程。那不是很好。如果您更愿意转储大量数据并稍后将其解析出来,请改为执行以下操作:

<?php
$path = $_SERVER['DOCUMENT_ROOT'] . '/wp-content/plugins/iphorm-form-builder';
$grep = shell_exec('grep --include=*.php -RHn -C4 do_action ' . escapeshellarg($path));
$matches = explode("\n--\n", $grep);
if (empty($matches)) {
    echo "failed reading to array";
}
else {
    foreach ($matches as $match) {
        echo "<pre>";
        echo htmlentities($match);
        echo "</pre>";
    }
}

关于php - 使用正则表达式和四行上下文匹配搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18739962/

有关php - 使用正则表达式和四行上下文匹配搜索的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  5. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  6. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  7. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  8. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  9. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  10. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

随机推荐