php – 使用正则表达式和四行上下文匹配搜索
例如,我有这样的代码:
<?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钩子:“do_action”和“apply_filters”有三个选项: 我可以在这里看到我正在尝试做的一个例子: 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
php escapeshellarg
bash grep
编辑 根据项目中的目录和文件数量,可能不具备高效性.您基本上是在每个文件的新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>"; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |