ФорумПрограммированиеPHP для идиотов → PHP. Поиск тела функции. Регулярка

PHP. Поиск тела функции. Регулярка

  • Ladari

    Сообщения: ? Репутация: N Группа: Кто попало

    Spritz 16 января 2012 г. 0:44

    Здравствуйте, помогите, пожалуйста, с регулярными выражениями.
    У меня есть файл со следующим содержимым:
    /*
    * GenerateTocXML.java
    * Copyright © 1999, 2003 Slava Pestov
    *
    * This program is free software; you can redistribute it and/or
    * modify it under the terms of the GNU General Public License
    * as published by the Free Software Foundation; either version 2
    * of the License, or any later version.
    *
    * This program is distributed in the hope that it will be useful,
    * but WITHOUT ANY WARRANTY; without even the implied warranty of
    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    * GNU General Public License for more details.
    *
    * You should have received a copy of the GNU General Public License
    * along with this program; if not, write to the Free Software
    * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
    */

    package doclet;

    import com.sun.javadoc.*;
    import com.sun.tools.doclets.standard.Standard;

    import java.io.*;
    import java.util.Arrays;

    public class GenerateTocXML
    {
    public static final String OUT = "toc.xml";
    public static final String HEADER = &quot;<?xml version=&#39;1.0&#39;?>\n<TOC>\n&quot;
    + &quot;<ENTRY HREF=&#39;overview-summary.html&#39;><TITLE>jEdit API Reference</TITLE>&quot;;
    public static final String FOOTER = &quot;</ENTRY></TOC>\n&quot;;

    public static boolean start(RootDoc root)
    {
    if (!Standard.start(root))
    {
    return false;
    }
    try
    {
    FileWriter out = new FileWriter(Standard.htmlDoclet.configuration().destDirName + OUT);
    out.write(HEADER);

    PackageDoc[] packages = root.specifiedPackages();
    for(int i = 0; i < packages.length; ++i)
    {
    processPackage(out,packages);
    }

    out.write(FOOTER);
    out.close();

    return true;
    }
    catch(IOException e)
    {
    e.printStackTrace();
    return false;
    }
    }

    public static int optionLength(String option)
    {
    return Standard.optionLength(option);
    }

    public static boolean validOptions(String[][] options, DocErrorReporter reporter)
    {
    return Standard.validOptions(options,reporter);
    }

    public static LanguageVersion languageVersion()
    {
    return Standard.languageVersion();
    }

    private static void processPackage(Writer out, PackageDoc pkg)
    throws IOException
    {
    out.write(&quot;<ENTRY HREF=&#39;&quot;);
    String pkgPath = pkg.name().replace(&#39;.&#39;,&#39;/&#39;) + &quot;/&quot;;
    out.write(pkgPath);
    out.write(&quot;package-summary.html&#39;><TITLE>&quot;);
    out.write(pkg.name());
    out.write(&quot;</TITLE>\n&quot;);

    ClassDoc[] classes = pkg.allClasses();
    String[] classNames = new String[classes.length];
    for(int i = 0; i < classes.length; i++)
    {
    classNames = classes.name();
    }
    Arrays.sort(classNames);

    for(int i = 0; i < classes.length; i++)
    {
    processClass(out,pkgPath,classNames);
    }

    out.write(&quot;</ENTRY>&quot;);
    }

    private static void processClass(Writer out, String pkgPath, String clazz)
    throws IOException
    {
    out.write(&quot;<ENTRY HREF=&#39;&quot;);
    out.write(pkgPath);
    out.write(clazz);
    out.write(&quot;.html&#39;><TITLE>&quot;);
    out.write(clazz);
    out.write(&quot;</TITLE>\n&quot;);
    out.write(&quot;</ENTRY>&quot;);
    }
    }

    В этом файле мне нужно, чтобы компьютер нашел содержимое функций.
    Например, для функции
    public static int optionLength(String option)
    {
    return Standard.optionLength(option);
    }
    получить
    return Standard.optionLength(option);

    И так для каждой функции в файле.
    Я просто не могу понять, как нужно написать выражение, чтобы нашло закрывающую скобку функции.
    Я пытаюсь написать следующее,
    /.*public.*\(.*\)\s*{(.*)}/
    Я стыкаюсь с тем, что символ . учитывает любой символ, кроме пробельного. (я сделала такой вывод)Потому что если я пишу /.*public.*\(.*\)\s*{\s*(.*)\s*}/, то мне находит
    [1] => Array
    (
    [0] => return Standard.optionLength(option);
    [1] => return Standard.validOptions(options,reporter);
    [2] => return Standard.languageVersion();
    )
    Но прописывать конкретное выражение под каждую функцию мне не подходит. Так как мне нужно универсальная регулярка, которая определяет тело функции.
    Как я только не пробовала и не получается. У меня просто будет много таких файлов(больше 200) и в каждом файле будет много функций, и у каждой разное тело.
  • technobulka

    Сообщения: 4552 Репутация: N Группа: Джедаи

    Spritz 16 января 2012 г. 1:21, спустя 37 минут 6 секунд

    Я просто не могу понять, как нужно написать выражение, чтобы нашло закрывающую скобку функции.

    [^}]
    Высокоуровневое абстрактное говно

Пожалуйста, авторизуйтесь, чтобы написать комментарий!